《剑指Offer》-- 从上到下打印二叉树(学会使用容器逐层保存二叉树,Python)

题目描述:

从上往下打印出二叉树的每个节点,同层节点从左至右打印。例如下图二叉树,依次打印出 [8, 6, 10, 5, 7, 9, 11]

思路:

使用一个容器(列表或者队列)将二叉树的各个节点有序保存起来,具体地,首先将根节点保存进底部,并使用指针指向容器底部,检查指针所指向的节点是否存在左右子节点,如果存在则依次添加进入容器,指针向上移动;否则指针直接向上移动。按照上述规律,指针不断往上移动,直到最后一个节点不存在左右子节点则结束。

例子如图所示,

1、定义一个容器并初始化将root压入容器底部,将指针指向容器最底部;

2、读取指针指向的root节点发现root存在左子节点a和右子节点b,则将a和b依次压入容器,然后指针上移一位指向a节点;

3、读取指针指向的a节点发现a节点存在左子节点c和右子节点d,则将c和d压入容器,然后指针上移一位指向b节点;

4、类似执行步骤2或者3

5、如果有子节点则先将子节点压入容器然后再上移指针,如果没有子节点则直接上移指针

6、读取停止条件,当指针指向容器的最后一位的后一位时,可以断定已经将所有的节点都添加到容器中

代码

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


def PrintFromTopToBottom(root):
    if not root:
        return []

    # 创建一个列表和指针,初始化时将根节点添加到容器中,指针指向容器底部
    stack = []
    stack.append(root)
    i = 0
    
    while i != len(stack):    # 结束条件,指针指向容器最后一位的后一位
        p = stack[i]     
        if p.left:                # 如果存在左子节点,则压入容器 
            stack.append(p.left)    
        if p.right:               # 如果存在右子节点,则压入容器
            stack.append(p.right)
        i += 1                    # 将指针向上移动
    
    # 读取节点值并返回
    stack = [node.val for node in stack]
    return stack
    

测试:

root = TreeNode(8)
a = TreeNode(6)
b = TreeNode(10)
c = TreeNode(5)
d = TreeNode(7)
e = TreeNode(9)
f = TreeNode(11)
g = TreeNode(12)
h = TreeNode(13)

root.left = a
root.right = b
a.left = c
a.right = d
b.left = e
b.right = f
d.left = g
d.right = h

print(PrintFromTopToBottom(root))

上述测试的树结构如下图所示,对应得到输出为 [8, 6, 10, 5, 7, 9, 11, 12, 13] 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值