剑指 Offer 32 - II. 从上到下打印二叉树 II
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
- BFS,广度优先,迭代遍历,使用队列存储节点,初始化将 root 节点入队,队列长度即为树分层后每一层的元素个数,以此循环出队,将其左右节点再入队,并且在出队时保存该值,最终将结果 add 到 list 中即可。
- DFS,深度优先,递归遍历,需要申明全局变量来保存结果。递归定义时加入层数参数,如果节点为空退出递归。如果结果的 size 小于层数,给结果中添加一个 new list,再给当前层(list.get(depth - 1))的 list add node.val,分别对节点的左右子树递归,最终返回结果。
代码
解法一
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
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;
}
}
解法二
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> levelOrder(TreeNode root) {
dfs(root, 1);
return res;
}
public void dfs(TreeNode node, int depth) {
if (node == null) return;
if (res.size() < depth) res.add(new ArrayList<>());
res.get(depth - 1).add(node.val);
dfs(node.left, depth + 1);
dfs(node.right, depth + 1);
}
}
本文由 Meridian 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Feb 27,2022