1.题目
题意简而言之就是求一颗二叉树的每一层最大节点,并用集合的形式将其返回。
2.思路
我的想法比较愚笨,是将此二叉树中的每一个节点标记上其所在的层数,然后在按层次标记遍历所有节点得出每一层的最大节点。其中做层次标记的时候与找最大节点时候都是用的层次遍历。
3.代码
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
class TreeNeuron{
TreeNode t;
int level;
public TreeNeuron(TreeNode t,int level){
this.t = t;
this.level = level;
}
}
public List<Integer> largestValues(TreeNode root) {
List<Integer> listMax = new ArrayList<Integer>();
Queue<TreeNeuron> qIn = new LinkedList<TreeNeuron>();//为了确定每个节点所在层数的辅助队列
Queue<TreeNeuron> qOut = new LinkedList<TreeNeuron>();//最后比较输出的队列
if(root == null)
return listMax;
TreeNeuron tn = new TreeNeuron(root,1);
qIn.add(tn); //根节点入队
int k ; //表示临时的层数
while(!qIn.isEmpty()){
TreeNeuron temp = qIn.poll();//出队
qOut.add(temp);
k = temp.level;
if(temp.t.left != null)
qIn.add(new TreeNeuron(temp.t.left,k+1));
if(temp.t.right != null)
qIn.add(new TreeNeuron(temp.t.right,k+1));
}
k = 1;//k从第一层开始
TreeNeuron temp = qOut.poll();//出队
while(temp != null){
int max = Integer.MIN_VALUE;
while(temp!=null && temp.level==k){
if(max < temp.t.val)
max = temp.t.val;
temp = qOut.poll();
}
k++;
listMax.add(max);
}
return listMax;
}