二叉树的定义和类

一、二叉树

        二叉树是一种树状数据结构,其中每个节点最多只能有两个子节点,通常称为左子节点和右子节点。二叉树的节点由指向左右子节点的指针以及存储数据的值组成

1.二叉树节点的类:

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val    #当前节点的值
        self.left = left    #指向左子节点的指针
        self.right = right    #指向右子节点的指针

2.简单构造这样的一棵树:

使用如下代码就能构造出上面那张图片中的二叉树

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val    #当前节点的值
        self.left = left    #指向左子节点的指针
        self.right = right    #指向右子节点的指针

# 创建节点
node1 = TreeNode(3)
node2 = TreeNode(9)
node3 = TreeNode(20)
node4 = TreeNode(15)
node5 = TreeNode(7)

# 构建树的结构
node1.left = node2
node1.right = node3
node3.left = node4
node3.right = node5

3.给定一个数组递归地构造二叉树:

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val    #当前节点的值
        self.left = left    #指向左子节点的指针
        self.right = right    #指向右子节点的指针

# 给定数组构造一棵二叉树
def build_tree(nodes, index):
    if index < len(nodes):
        if nodes[index] is None:
            return None
        #首先传入数组第一个元素,即根节点
        root = TreeNode(nodes[index])
        #递归地构造左子树、右子树
        root.left = build_tree(nodes, 2 * index + 1)    #该节点对应左子节点的索引就是2 * index + 1,如果不知道为什么是这个,可以自己画一个二叉树的图标出索引,节点与子节点的索引是满足这个条件的
        root.right = build_tree(nodes, 2 * index + 2)    #该节点对应左子节点的索引就是2 * index + 2
        return root
    return None

# 举例给定数组
nodes_array = [1, 2, 3, 4, 5, 6, 7]
root_node = build_tree(nodes_array, 0)

       这里递归的大致顺序如下(或者看图上的标号就是顺序),如果看着不是很能理解建议将上述代码复制到pycharm中打断点,一步一步地进行或者照着下面的步骤画一棵树,就能理解了:

传入根节点值(第零层)

构造根节点的左子节点(第一层):

        传入左子结点的值

        构造左子节点的左子节点(第二层)(如果数组里还有这个元素):

                传入左子节点的左子节点的值:

                        构造左子节点的左子节点的左子节点(第三层):

                                ...

                        构造左子节点的左子节点的右子节点(第三层):

                                ...

        构造左子节点的右子节点(第二层):

                传入左子节点的右子节点的值:

                        构造左子节点的右子节点的左子节点(第三层):

                                ...

                        构造左子节点的右子节点的柚子节点(第三层):

                                ...

构造根节点的右子节点(第一层):

        与左子树构造同理

完成构造        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值