问题描述
Given a binary tree, return the postorder traversal of its nodes’ values.
给定二叉树,返回层次遍历。
For example:
Given binary tree{1,#,2,3},
3
/ \
9 20
/ \
15 7
return its level order traversal as:
[
[3],
[9,20],
[15,7]
]
解题思路
方法一
- 先把根节点放到queue里
- 用一个for循环遍历它们,找队首节点的左右两个子节点,放入到queue里(此时queue里的元素就是下一层的所有节点),将队首的值放到一维向量里
- for遍历完之后再把这个一维向量存到二维向量里
public List<List<Integer>> levelOrder(TreeNode root) {
if(root == null) return new ArrayList<>();
List<List<Integer>> twoD = new ArrayList<>();
List<TreeNode> queue = new ArrayList<>();
queue.add(root);
while (!queue.isEmpty()){
List<Integer> oneD = new ArrayList<>();
for (int i = queue.size(); i > 0; i--) {
TreeNode curNode = queue.remove(0);
oneD.add(curNode.val);
if(curNode.left != null) queue.add(curNode.left);
if(curNode.right != null) queue.add(curNode.right);
}
twoD.add(oneD);
}
return twoD;
}
方法二
递归法:
- 由于递归的特性,当要加入某个结点的时候,我们必须要知道当前的深度,所以使用一个变量level来标记当前的深度,初始化带入0,表示根结点所在的深度。
- 由于需要返回的是一个二维数组wrapList ,开始时我们又不知道二叉树的深度,不知道有多少层,只能在遍历的过程中不断的增加。当level等于二维数组的大小的时候,就需要新申请一层了。
- 递归左结点
- 递归右结点
- 将当前结点放入一维向量里。
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> twoD = new ArrayList<>();
digui(twoD, root, 0);
return twoD;
}
public void digui(List<List<Integer>> twoD, TreeNode root, int level) {
if(root == null) return;
if(level >= twoD.size()) {
twoD.add(new ArrayList<Integer>());
}
digui(twoD, root.left, level+1);
digui(twoD, root.right, level+1);
twoD.get(level).add(root.val);
}