[LeetCode]Binary Tree Level Order Traversal

时间:2023-02-02 14:56:45


Question
Given a binary tree, return the level order traversal of its nodes’ values. (ie, from left to right, level by level).

For example:
Given binary tree ​​​[3,9,20,null,null,15,7]​​,

3
/ \
9 20
/ \
15 7

return its level order traversal as:

[
[3],
[9,20],
[15,7]
]

本题难度Easy。有2种算法分别是: 递归法和迭代法

1、递归法

【复杂度】
时间 O(b^(h+1)-1) 空间 O(b^h)

【思路】
本题实质是广度优先搜索BFS,而用队列可以轻松地实现它。不断地从队列​​​q​​​中取出节点​​n​​​,将其值​​n.val​​​写入​​list​​​,再将​​n​​​的左右两个节点放入新的队列​​nextQ​​​中。完毕后,将​​list​​​放入结果​​ans​​中,然后进行下一个层序遍历,直至到达 base case 条件。

【注意】
第15行和第31、32行都对节点是否为null进行了判断。

【代码】

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
//require
List<List<Integer>> ans=new LinkedList<>();
Queue<TreeNode> q=new LinkedList<>();
if(root!=null)q.add(root);
//invariant
helper(q,ans);
//ensure
return ans;
}
private void helper(Queue<TreeNode> q,List<List<Integer>> ans){
//base case
if(q.isEmpty())
return;

List<Integer> list=new LinkedList<>();
Queue<TreeNode> nextQ=new LinkedList<>();
while(!q.isEmpty()){
TreeNode n=q.remove();
list.add(n.val);
if(n.left!=null)nextQ.add(n.left);
if(n.right!=null)nextQ.add(n.right);
}
ans.add(list);
helper(nextQ,ans);
}
}

2、迭代法

【复杂度】
时间 O(b^(h+1)-1) 空间 O(b^h)

【思路】
在递归法基础上改过来,不同点在于始终只使用一个队列​​​q​​​,为了在队列中区分各层节点,利用​​q​​的大小对20-25行的循环次数加以控制。

【代码】

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
//require
List<List<Integer>> ans=new LinkedList<>();
Queue<TreeNode> q=new LinkedList<>();
if(root!=null)q.add(root);
//invariant
while(!q.isEmpty()){
List<Integer> list=new LinkedList<>();
int size=q.size();
for(int i=0;i<size;i++){
TreeNode n=q.remove();
list.add(n.val);
if(n.left!=null)q.add(n.left);
if(n.right!=null)q.add(n.right);
}
ans.add(list);
}
//ensure
return ans;
}
}

参考

​​[Leetcode] Binary Tree Traversal 二叉树遍历​​