美文网首页剑指offer- python实现
面试题32:从上到下打印二叉树

面试题32:从上到下打印二叉树

作者: 不会编程的程序猿甲 | 来源:发表于2020-03-20 21:03 被阅读0次

    题目一:不分行从上到下打印二叉树
    从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。

    解题思路:
    总结规律为首先将根节点加入到队列中,然后当队列不为空时,打印队列首部的的节点值,如果该节点有左右节点则将左右节点加入队列的尾部,接着需要再将队列首部的元素取出,重复上述的打印操作。

    代码实现:

    # -*- coding:utf-8 -*-
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    class Solution:
        # 返回从上到下每个节点值列表,例:[1,2,3]
        def PrintFromTopToBottom(self, root):
            # write code here
            if root is None:
                return []  #如果为空,直接返回空列表
            #保存节点的缓存队列
            res = []
            res_val = []
            res.append(root)
            while len(res)>0:
                Node = res.pop(0)        #将队列头部的节点取出
                res_val.append(Node.val)#加入打印的列表的尾端
                if Node.left:            #如果该节点有左节点将其加入队列尾端
                    res.append(Node.left)
                if Node.right:           #如果该节点有右节点将其加入队列尾端
                    res.append(Node.right)
            return res_val              #最终返回值列表
    

    提交结果:

    ————————————————————————————————
    题目二:
    分行打印按照层次遍历的结果

    解题思路:
    这道题和上一题目思路一样,但是多了一个换行控制,将同一层的val添加到一个列表,当需要换行时把这一列表的值全部添加到打印列表,然后进行下一层的列表添加。为此需要引入两个变量,一个是当前层需要打印的节点数,一个是下一层的总节点数,当当前层次需要打印的节点数为0是进行当前层的列表添加操作并且进行变量更新以便于下层的打印。

    代码实现:

    # -*- coding:utf-8 -*-
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    class Solution:
        # 返回从上到下每个节点值列表,例:[1,2,3]
        def Print(self, pRoot):
            # write code here
            if pRoot ==  None:
                return []
            res = []
            res_val = []
            res.append(pRoot)
    
            ToBePrint = 1 #根节点为一个节点
            NextLevel = 0 #下一层的节点数
            temp = []     #储存每层节点的变量 
            while len(res)>0:
                
                node = res.pop(0)
                temp.append(node.val)
                ToBePrint -=1    #要打印的数目减1
    
                if node.left:
                    res.append(node.left)
                    NextLevel+=1  #x下一层节点数加1
                if node.right:
                    res.append(node.right)
                    NextLevel+=1
                if ToBePrint ==0: #该层的节点数已经打印结束
                    res_val.append(temp)
                    
                    ToBePrint = NextLevel  #更新变量
                    NextLevel = 0
                    temp = []
            return res_val
    

    提交结果:


    —————————————————————————————————
    题目三:
    之字型打印二叉树

    思路:
    这道题可以受上面题目二的启发,即在上述的条件下,再增加一个lefttoright的变量,初始化为true,一层打印结束之后,将lefttoright反转,当lefttoright到为真时,和上述一致,当为假时,将temp倒叙加入到列表中,具体如下:

    32 之字形打印二叉树.png

    代码实现:

    # -*- coding:utf-8 -*-
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    class Solution:
        # 返回从上到下每个节点值列表,例:[1,2,3]
        def Print(self, pRoot):
            # write code here
            if pRoot ==  None:
                return []
            res = []
            res_val = []
            res.append(pRoot)
            leftToright = True
    
            ToBePrint = 1 #根节点为一个节点
            NextLevel = 0 #下一层的节点数
            temp = []     #储存每层节点的变量 
            while len(res)>0:
                
                node = res.pop(0)
                temp.append(node.val)
                ToBePrint -=1    #要打印的数目减1
    
                if node.left:
                    res.append(node.left)
                    NextLevel+=1  #x下一层节点数加1
                if node.right:
                    res.append(node.right)
                    NextLevel+=1
                if ToBePrint ==0: #该层的节点数已经打印结束
                    if leftToright:
                        res_val.append(temp)
                    else:
                        res_val.append(temp[::-1])
                    ToBePrint = NextLevel  #更新变量
                    NextLevel = 0
                    temp = []
                    leftToright = not leftToright
            return res_val
    

    提交结果:

    相关文章

      网友评论

        本文标题:面试题32:从上到下打印二叉树

        本文链接:https://www.haomeiwen.com/subject/zivcyhtx.html