剑指 Offer 32 - I、剑指 Offer 32 - II、剑指 Offer 32 - III.从上到下打印二叉树 、 NC45 实现二叉树先序,中序和后序遍历

offer32-i 题:从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印

#广度优先搜索

class Solution:
    def levelOrder(self, root: TreeNode) -> List[int]:
        if not root:return []
        res,sub=[],collections.deque()
        sub.append(root)
        while sub:
            node=sub.popleft()#出来一个 并从sub中删除
            res.append(node.val)#放进列表
            #瞧瞧当前节点的左右子节点
            if node.left:
                sub.append(node.left)
            if node.right:
                sub.append(node.right)
        return res

面试题32 - I. 从上到下打印二叉树(层序遍历 BFS ,清晰图解) - 从上到下打印二叉树 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/solution/mian-shi-ti-32-i-cong-shang-dao-xia-da-yin-er-ch-4/

  • collections.deque() 是双边队列,具有列表和栈的性质。队列两端插入、删除元素时间复杂度是O(1),在列表开头插入、删除元素时间复杂度是O(N)

python3 deque(双向队列) - Water~ - 博客园 (cnblogs.com)https://www.cnblogs.com/zhenwei66/p/6598996.html

 offe32-ii 题:每层打印到一行

#与上一道类似,主要是思考如何分层,直接用层节点数最省时间和空间。for遍历当前层节点数len(sub),将当前层全部节点打印到一行tmp。

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:return []
        res,sub=[],collections.deque()
        sub.append(root)
        while sub:
            tmp=[]
            for i in range(len(sub)):#!!!循环次数为当前层节点数 牛
                node=sub.popleft()#出来一个 并从sub中删除  
                tmp.append(node.val)#放进列表
                if node.left:
                    sub.append(node.left)
                if node.right:
                    sub.append(node.right)
            res.append(tmp)
        return res

 

offer32-iii 题:之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,

  •  在于确定奇偶数层,正倒存储该层
class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:return []
        res,sub=[],collections.deque()
        sub.append(root)
        j=1
        while sub:
            tmp=[]
            for i in range(len(sub)):
                node=sub.popleft()
                tmp.append(node.val)
                if node.left:
                    sub.append(node.left)
                if node.right:
                    sub.append(node.right)
            if j%2==0:
                res.append(tmp[::-1])#偶数层 -> 该层倒着放入
            else:
                res.append(tmp)#奇数层 -> 该层正着放入
            j+=1
        return res

 NC45 题: 给定一棵二叉树,分别按照二叉树先序,中序和后序打印所有的节点。

class Solution:
    def threeOrders(self , root: TreeNode) -> List[List[int]]:
        gen,zhong,hou=[],[],[]
        def find(root):
            if not root: return 
            gen.append(root.val)#(根序)根左右
            find(root.left)#(中序)左根右
            zhong.append(root.val)#找到第一个 
            find(root.right)#(后序)左右根
            hou.append(root.val)
        find(root)    
        return [gen,zhong,hou]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值