【python】二叉树

二叉树

定义

二叉树是每个结点最多有两个子树的树结构。它有五种基本形态:二叉树可以是空集;根可以有空的左子树或右子树;或者左、右子树皆为空。


二叉树的五种基本形态

由于python的基本变量类型中没有二叉树类型,因此要使用python实现二叉树的相关操作需要先自定义二叉树类

思路

定义二叉树节点类TreeNode,包含三个属性:值,左子节点,右子节点。

  • val:表示本节点的值,字符、数字或其他类型都可以,在定义本节点时传入;
  • left:表示本节点的左子节点,可以为空或节点,初值为None;
  • right:表示本节点的右子树,可以为空或节点,初值为None;

代码

class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

前序遍历

定义

前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。

若二叉树为空则结束返回,否则:

  1. 访问根结点。
  2. 前序遍历左子树。
  3. 前序遍历右子树 。

前序遍历数组=>二叉树

给定前序遍历的序列数组,由该数组生成一个二叉树
思路
递归


def make_a_Binary_Tree_by(li):
    if li[0]!=None:
        node = TreeNode(li.pop(0))
        node.left=make_a_Binary_Tree_by(li)
        node.right=make_a_Binary_Tree_by(li)
    else:
        return li.pop(0)
    return node
二叉树=>前序遍历数组

给一个二叉树,求出该二叉树的前序遍历序列
思路
递归


def preorder_traversal(root):
    li=[]
    if root!=None:
        li+=[root.val]
        li+=preorder_traversal(root.left)
        li+=preorder_traversal(root.right)
    else:
        return []
    return li

测试代码

#coding utf-8
#144. Binary Tree Preorder Traversal
class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
def make_a_Binary_Tree_by(li):
    if li[0]!=None:
        node = TreeNode(li.pop(0))
        node.left=make_a_Binary_Tree_by(li)
        node.right=make_a_Binary_Tree_by(li)
    else:
        return li.pop(0)
    return node
def preorder_traversal(root):
    li=[]
    if root!=None:
        li+=[root.val]
        li+=preorder_traversal(root.left)
        li+=preorder_traversal(root.right)
    else:
        return []
    return li
def main():
    l = [10, 7, 4,None,None, 9,None,None, 13, None, 15,None,None]
    root=make_a_Binary_Tree_by(l)
    print('\t\t',root.val)
    print('\t',root.left.val,'\t\t  ',root.right.val)
    print(' ',root.left.left.val,'   ',root.left.right.val,' ',root.right.left,'  ',root.right.right.val)
    print(preorder_traversal(root))
if __name__ == '__main__':
    main()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,528评论 1 31
  • 前言 树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。一直以来,对于树的掌握都是模棱两可的状态,现在希望通...
    MrHorse1992阅读 354,350评论 51 536
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 6,184评论 0 13
  • 四、树与二叉树 1. 二叉树的顺序存储结构 二叉树的顺序存储就是用数组存储二叉树。二叉树的每个结点在顺序存储中都有...
    MinoyJet阅读 1,637评论 0 7
  • 数据结构和算法--二叉树的实现 几种二叉树 1、二叉树 和普通的树相比,二叉树有如下特点: 每个结点最多只有两棵子...
    sunhaiyu阅读 6,590评论 0 14