1. 标记每层最右结点
1.1 分析
辅助队列
last记录本层最右结点,nLast记录下层最右结点(入队时标记)。出队到last时本层输出完,last更新为nLast。
1.2 代码
import java.util.*
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer> > res = new ArrayList<>();
ArrayList<Integer> list = new ArrayList<>();
Queue<TreeNode> q = new LinkedList<>();
if(pRoot == null) return res;
TreeNode last = pRoot;
TreeNode nLast = null;
q.offer(pRoot);
while(!q.isEmpty()){
//出队,加入本层数组
TreeNode node = q.poll();
list.add(node.val);
//左右孩子入队
//nLast 记录最新入队的结点,用于标记本层最右结点
if(node.left!=null){
q.offer(node.left);
nLast = node.left;
}
if(node.right!=null){
q.offer(node.right);
nLast = node.right;
}
//本层结点出队完毕,本层数组加入二维数组,last更新为nLast
if(node == last ){//最后一层出队后,q空,但还需要加入数组
res.add(list);
list = new ArrayList<>();
last = nLast;
}
}
return res;
} 1.3 复杂度
空间:O(n)
时间:O(n)
2. 每层结点计数
2.1 分析
辅助队列
thislevel和nextLevel代表当前和下一层结点数
2.2 代码
import java.util.*
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer> > res = new ArrayList<>();
ArrayList<Integer> list = new ArrayList<>();
Queue<TreeNode> q = new LinkedList<>();
if(pRoot == null) return res;
int thisLevel = 1;
int nextLevel = 0;
q.offer(pRoot);
while(!q.isEmpty()){
//出队,加入本层数组
TreeNode node = q.poll();
list.add(node.val);
thisLevel--;
//左右孩子入队
if(node.left!=null){
q.offer(node.left);
nextLevel++;
}
if(node.right!=null){
q.offer(node.right);
nextLevel++;
}
//本层结点出队完毕,本层数组加入二维数组
if(thisLevel == 0 ){
res.add(list);
list = new ArrayList<>();
thisLevel = nextLevel;
nextLevel = 0;
}
}
return res;
}
} 2.3 复杂度
同1



京公网安备 11010502036488号