python之遍历求二叉树的深度、先序遍历、中序遍历、后序遍历

二叉树的结点用一个数组顺序存储,-1表示该节点为空,实现求该二叉树的深度、先序遍历、中序遍历、后序遍历

首先定义一个 Node 类 ,用于表示二叉树中的节点。

class Node:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

 创建二叉树

def create_binary_tree(a, index):    #a是顺序存储树节点的数组
    if index >= len(a) or a[index] == -1:    #如果下标超过或者本来该结点为空 
        return None
    node = Node(a[index])
    node.left = create_binary_tree(a, 2 * index + 1)    #创建node结点的左子树 
    node.right = create_binary_tree(a, 2 * index + 2)    #创建node结点的右子树
    # 数组下标从0开始,所以2i+1是左孩子,2i+2是右孩子    
    return node

dfs算法求树的深度

def dfs(root, res, max_depth):    #res是当前深度, max_depth是最大深度
    if root is None:    #递归结束条件
        return max_depth
    if root.left is None and root.right is None:    #如果是叶子结点
        if res > max_depth:    #判断当前深度是否大于最大深度
            max_depth = res    #如果是就更新最大深度
    max_depth = dfs(root.left, res + 1, max_depth)    #递归左子树
    max_depth = dfs(root.right, res + 1, max_depth)    #递归右子树
    return max_depth

 先序遍历函数

def pre_order(root):    #根左右
    if root is None:
        return
    print(root.val, end=" ")
    pre_order(root.left)
    pre_order(root.right)

中序遍历函数

def in_order(root):    #左根右
    if root is None:
        return
    in_order(root.left)
    print(root.val, end=" ")
    in_order(root.right)

 后序遍历函数

def post_order(root):    #左右根
    if root is None:
        return
    post_order(root.left)
    post_order(root.right)
    print(root.val, end=" ")

 主函数

if __name__ == "__main__":
    arr = [3, 9, 20, 5, 16, 15, 7, -1, 8]
    tree = create_binary_tree(arr, 0)
    #创建二叉树tree,该树实质是一个结点,该结点直接或间接指向其它结点 
    depth = dfs(tree, 1, 0)
    print("树的深度:",end="")
    print(depth)

    print("先序序列为:", end="")
    pre_order(tree)
    print()

    print("中序序列为:", end="")
    in_order(tree)
    print()

    print("后序序列为:", end="")
    post_order(tree)

 

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Genius256

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值