剑指32打印二叉树

140 阅读1分钟

剑指 Offer 32 - II. 从上到下打印二叉树 II

在这里插入图片描述

思路:BFS(参考55)
创建一个队列/列表que来储存每层节点
由于需要每层打印,创建一个临时列表p来存每一层的打印结果
需要一个中间变量temp储存每层遍历的节点,每次遍历更新que重置temp(这样需要额外的存储空间来储存每一层的节点)
改进:用两端队列来储存节点,遍历时对队列进行操作:
每次遍历,删除队列左边第一个旧节点,同时将新节点添加至队列末尾
每层的循环次数为len(que),这样不需要额外存储空间

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:return []
        #ans储存最终打印结果,que储存每一层节点
        ans=[]
        que=[root]
        while que:
        	#temp储存遍历到的新节点,更新que,p储存每一层的打印结果
            temp=[]
            p=[]
            for i in que:
                p.append(i.val)
                if i.left:temp.append(i.left)
                if i.right:temp.append(i.right)
            #更新que,将该层打印结果添加至ans中
            que=temp
            ans.append(p)
        return ans

在这里插入图片描述

剑指 Offer 32 - III. 从上到下打印二叉树 III

思路同上,需要添加一个标志变量确定奇偶层

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:return []
        res,que=[],collections.deque()
        que.append(root)
        #标志符,大于0为奇数层,小于0偶数层,每层更新乘-1
        f=1
        while que:
            p=[]
            #奇数层正向打印,删除头节点,新节点添加至队尾
            if f>0:
                for _ in range(len(que)):
                    node=que.popleft()
                    p.append(node.val)
                    if node.left:que.append(node.left)
                    if node.right:que.append(node.right)
            #偶数层逆向打印,删除尾节点,新节点添加至队头
            if f<0:
                for _ in range(len(que)):
                    node=que.pop()
                    p.append(node.val)
                    if node.right:que.appendleft(node.right)
                    if node.left:que.appendleft(node.left)
            res.append(p)
            #翻转标志位
            f*=-1
        return res