在二叉树的每一行中找到最大的值。

示例:

输入: 

          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;	        	        
		    }

猜你喜欢

转载自blog.csdn.net/qq_36781505/article/details/81186301