剑指Offer 22. 从上往下打印二叉树 (二叉树)

Posted huangqiancun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer 22. 从上往下打印二叉树 (二叉树)相关的知识,希望对你有一定的参考价值。

题目描述

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

题目地址

https://www.nowcoder.com/practice/7fe2212963db4790b57431d9ed259701?tpId=13&tqId=11175&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

思路

使用队列

技术分享图片

因为按层打印的顺序决定应该先打印根结点,所以我们从树的根结点8开始分析。为了接下来能够打印值为8的两个子结点,我们应该遍历该结点时把值为6和10的两个结点保存到一个容器里,现在容器内就有两个结点了。按照从左到右打印的要求,我们先取出为6的结点。打印出值6之后把它的值分别为5和7的两个结点放入数据容器。此时数据容器中有三个结点,值为10,5和7。接下来我们从容器中取出值为10的结点,注意到值为10的结点比值为5,7的结点先放入容器,此时又比这两个结点先取出,同时将9和11放入数据容器,这就是我们通常说的先入先出,因此数据容器为一个队列。由于值为5,7,9,11的结点都没有子结点,因此只要依次打印即可。

技术分享图片

通过例子,我们找到从上到下打印二叉树的规律:每一次打印一个结点的时候,如果该结点有子结点,则把该结点的左右结点依次放到一个队列的末尾。接下来到队列的头部取出最早进入队列的结点,重复前面的打印操作,直到队列中所有结点都打印出来为止。

Python

# -*- coding:utf-8 -*-
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
node1 = TreeNode(8)
node2 = TreeNode(6)
node3 = TreeNode(10)
node4 = TreeNode(5)
node5 = TreeNode(7)
node6 = TreeNode(9)
node7 = TreeNode(11)
node1.left = node2
node1.right = node3
node2.left = node4
node2.right = node5
node3.left = node6
node3.right = node7

class Solution:
    # 返回从上到下每个节点值列表,例:[1,2,3]
    def PrintFromTopToBottom(self, root):
        # write code here
        ans = []
        if not root:
            return ans
        queue = []
        queue.append(root)
        while queue:
            cur = queue.pop(0)
            ans.append(cur.val)
            if cur.left:
                queue.append(cur.left)
            if cur.right:
                queue.append(cur.right)
        return ans

if __name__ == __main__:
    result = Solution().PrintFromTopToBottom(node1)
    print(result)

以上是关于剑指Offer 22. 从上往下打印二叉树 (二叉树)的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer-从上往下打印二叉树22

剑指offer22 从上往下打印二叉树

剑指Offer22从上往下打印二叉树

剑指offer系列——22.从上往下打印二叉树

[剑指Offer] 22.从上往下打印二叉树

剑指offer-从上往下打印二叉树