示例:
输入:
1
/ \
3 2
/ \ \
5 3 9
输出: [1, 3, 9]
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
最开始看到这个题的时候,认为就是二叉树的层序遍历。脑袋不太够用。没有去考虑递归的方法。
所以就用了非递归的方法。就是一个while循环,结合Queue就能轻松实现遍历。
然而,怎么比较每一行的最大值呢。我又不知道每一行有多少个节点,刚开始想了一个比较笨的方法
就是构造出一个满二叉树,给没有的节点添上让其值等于Integer.MIN_VALUE;然后每一层的值就是固定的了,
这样就能判断节点是否在同一层了,但是这样有个严重的缺陷,树的深度比较小的时候,节点数比较小,一旦数的深度躲起来,其节点数就会呈指数增长,这样会导致超内存和超时间。所以最终还是放弃了这种方法。
思考了很久,拿张纸画了画,仔细分析遍历的整个过程
然后我就想到了一个方法,就是队列里面只保留树的一层,先让树的一层全部出队之后,再让下一层入队。(当下一层的节点需要入队的时候先放入另一个队列中。当第一个队列空了之后,再两个队列交换)相当于一个队列负责进,一个队列负责出,当(出的队列空了之后,说明该层遍历完了,然后交换)
代码如下:
public static List<Integer> largestValues(TreeNode root) {
List<Integer>list=new ArrayList<>();
int max=Integer.MIN_VALUE;
//层序遍历
Queue<TreeNode>queue=new LinkedList<>();
Queue<TreeNode>q=new LinkedList<>();
queue.add(root);
TreeNode t;
while(null!=(t=queue.poll())) {
if(t.val>max)max=t.val;
if(t.left!=null)q.add(t.left);
if(t.right!=null)q.add(t.right);
if(queue.isEmpty()) {
list.add(max);
max=Integer.MIN_VALUE;
queue=q;
q=new LinkedList<>();
}
}
return list;
}