前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【算法题解】 Day22 搜索与回溯

【算法题解】 Day22 搜索与回溯

作者头像
sidiot
发布2023-08-31 13:52:38
1580
发布2023-08-31 13:52:38
举报
文章被收录于专栏:技术大杂烩

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

题目

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

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

例如: 给定二叉树: [3,9,20,null,null,15,7],

代码语言:javascript
复制
    3
   / \
  9  20
    /  \
   15   7

返回:

代码语言:javascript
复制
[3,9,20,15,7]

提示:

  1. 节点总数 <= 1000

方法一:BFS

思路

根据题意,这是二叉树的广度优先搜索(BFS)。BFS 通常借助 队列 的先入先出特性来实现。

  1. 特例处理:  当树的根节点为空,则直接返回空列表 [] ;
  2. 初始化:  打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;
  3. BFS 循环:  当队列 queue 为空时跳出;
    1. 出队:  队首元素出队,记为 node
    2. 打印:  将 node.val 添加至列表 tmp 尾部;
    3. 添加子节点:  若 node 的左(右)子节点不为空,则将左(右)子节点加入队列 queue ;
  4. 返回值:  返回打印结果列表 res 即可。  

解题

Python:

代码语言:javascript
复制
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

Java:

代码语言:javascript
复制
class Solution {
    public int[] levelOrder(TreeNode root) {
        if(root == null) return new int[0];
        Queue<TreeNode> queue = new LinkedList<>(){{ add(root); }};
        ArrayList<Integer> ans = new ArrayList<>();
        while(!queue.isEmpty()) {
            TreeNode node = queue.poll();
            ans.add(node.val);
            if(node.left != null) queue.add(node.left);
            if(node.right != null) queue.add(node.right);
        }
        int[] res = new int[ans.size()];
        for(int i = 0; i < ans.size(); i++)
            res[i] = ans.get(i);
        return res;
    }
}

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

题目

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

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

例如: 给定二叉树: [3,9,20,null,null,15,7],

代码语言:javascript
复制
    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

代码语言:javascript
复制
[
  [3],
  [9,20],
  [15,7]
]

提示:

  1. 节点总数 <= 1000

方法一:BFS

思路

跟上一题相差不大,刚好可以验证一下是否掌握了,不多赘述;  

解题

Python:

代码语言:javascript
复制
class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root: return []
        res, queue = [], collections.deque()
        queue.append(root)
        while queue:
            tmp = []
            for _ in range(len(queue)):
                node = queue.popleft()
                tmp.append(node.val)
                if node.left: queue.append(node.left)
                if node.right: queue.append(node.right)
            res.append(tmp)
        return res

Java:

代码语言:javascript
复制
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();
        List<List<Integer>> res = new ArrayList<>();
        if(root != null) queue.add(root);
        while(!queue.isEmpty()) {
            List<Integer> tmp = new ArrayList<>();
            for(int i = queue.size(); i > 0; i--) {
                TreeNode node = queue.poll();
                tmp.add(node.val);
                if(node.left != null) queue.add(node.left);
                if(node.right != null) queue.add(node.right);
            }
            res.add(tmp);
        }
        return res;
    }
}

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

题目

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

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

例如: 给定二叉树: [3,9,20,null,null,15,7],

代码语言:javascript
复制
    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

代码语言:javascript
复制
[
  [3],
  [20,9],
  [15,7]
]

提示:

  1. 节点总数 <= 1000

方法一:BFS

思路

跟之前的题目还是大相庭径的,这题的话,打印顺序交替变化,因此可以考虑双端队列;  

解题

Python:

代码语言:javascript
复制
class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root: return []
        res, deque = [], collections.deque([root])
        while deque:
            tmp = collections.deque()
            for _ in range(len(deque)):
                node = deque.popleft()
                if len(res) % 2: tmp.appendleft(node.val) # 偶数层 -> 队列头部
                else: tmp.append(node.val) # 奇数层 -> 队列尾部
                if node.left: deque.append(node.left)
                if node.right: deque.append(node.right)
            res.append(list(tmp))
        return res

Java:

代码语言:javascript
复制
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();
        List<List<Integer>> res = new ArrayList<>();
        if(root != null) queue.add(root);
        while(!queue.isEmpty()) {
            LinkedList<Integer> tmp = new LinkedList<>();
            for(int i = queue.size(); i > 0; i--) {
                TreeNode node = queue.poll();
                if(res.size() % 2 == 0) tmp.addLast(node.val); // 偶数层 -> 队列头部
                else tmp.addFirst(node.val); // 奇数层 -> 队列尾部
                if(node.left != null) queue.add(node.left);
                if(node.right != null) queue.add(node.right);
            }
            res.add(tmp);
        }
        return res;
    }
}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 剑指 Offer 32 - I. 从上到下打印二叉树
    • 题目
      • 方法一:BFS
        • 思路
        • 解题
    • 剑指 Offer 32 - II. 从上到下打印二叉树 II
      • 题目
        • 方法一:BFS
          • 思路
          • 解题
      • 剑指 Offer 32 - III. 从上到下打印二叉树 III
        • 题目
          • 方法一:BFS
            • 思路
            • 解题
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档