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

本文介绍了一种解决二叉树层序遍历中每层最大值问题的非递归方法,通过使用两个队列交替进行节点进出操作,有效地避免了构建满二叉树带来的内存和时间开销。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

示例:

输入: 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值