搜索与回溯算法(简单)【剑指offer】

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

解题思路:

  • 题目要求的二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)
  • BFS 通常借助 队列 的先入先出特性来实现

在这里插入图片描述
算法流程:

1.特例处理: 当树的根节点为空,则直接返回空列表 [ ] ;
2.初始化: 打印结果列表 res = [ ] ,包含根节点的队列 queue = [root]
3.BFS 循环: 当队列 queue 为空时跳出
  a.初始化一个tmp列表用于添加下一层节点
  b.遍历当前层节点:
    (1)添加子节点: 如果队列queue中当前节点有左(右)子节点,则把左右子节点加入tmp
    (2)打印当前节点值: 将当前层节点即queue中的节点值添加到res
  c.更新队列queue内容为下一层节点,即另queue=tmp
4.返回值: 返回打印结果列表 res 即可

class Solution:
    def levelOrder(self, root: TreeNode) -> List[int]:
        if not root: return[]
        res, queue =[], [root]
        while queue:
            tmp = []
            for i in queue:
                if i.left: tmp.append(i.left)
                if i.right: tmp.append(i.right)
                res.append(i.val)
            queue = tmp
        return res

补充:
collections是python自带的库,collections.deque()是双端队列,可以实现左右两端添加或取出元素的功能,时间复杂度均为O(1),同时具有栈和队列的性质。

q = collections.deque()
q.append('a') # 在队列右边添加元素‘a’,deque(['a'])
q.appendleft('b') # 在队列左边添加元素‘b’,deque(['b', 'a'])
q.extend('c') # 在队列右边添加序列,deque(['b', 'a', 'c'])
q.extendleft('d') # 在队列左边添加序列,deque(['d', 'b', 'a', 'c'])
# 取出元素
q.pop() # 右端取出
q.popleft() # 左端取出
class Solution:
    def levelOrder(self, root: TreeNode) -> List[int]:
		if not root: return []
    	res, queue = [], collections.deque()
   	    queue.append(root)
        while queue:
            node = queue.popleft()
            res.append(node.val)
            if node.left: queue.append(node.left)
            if node.right: queue.append(node.right)
        return res

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

思路与题一的基本方法差不多,就是多了个把每一层的节点值放到一个列表li中,再把li加入到res

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root: return []
        res, queue = [], [root]
        while queue:
            tmp = []
            li = []
            for i in queue:
                if i.left: tmp.append(i.left)
                if i.right: tmp.append(i.right)
                li.append(i.val)
            res.append(li)
            queue = tmp    
        return res

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

思路是在题二的基础上,多一个判断层数奇偶,如果是偶数层,就把li内容翻转再加入res

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root: return []
        res, queue = [], [root]
        n = 1
        while queue:
            tmp,li = [], []
            for i in queue:
                if i.left: tmp.append(i.left)
                if i.right: tmp.append(i.right)
                li.append(i.val)
            
            if n % 2 == 0:
                reverse = []
                for j in range(len(li)):
                    reverse.append(li.pop())
                li = reverse
            n += 1
            res.append(li)
            queue = tmp

        return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值