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