二叉树层次遍历

leetcode传送门:传送门
本来是前几天同学问的一个面试题,好久不做有点懵逼,今天想起来了做一下,其实就是二叉树层次遍历,只不过要检测一下每一层的结尾,我刚开始想的是记录一下最后一个元素的右子树的值,没有右子树,记录左子树,不过可能会存在这样的树
在这里插入图片描述
所以说要换种方法,其实就不用换,层次遍历的话就是在当前节点的基础上进行广度优先搜索,如果每次都移除掉队首元素的话,队列中元素的个数就是当前层次的元素个数,逐步解释可能更清晰
在这里插入图片描述

  1. 首次将A加入队列,则当前层次总数为1
  2. 取出队首节点A,搜索周遭节点,加入节点BC
  3. 队列元素只有BC,则这一层只有BC,依次取出BC,在搜索BC周遭节点,加入DE
  4. 队列元素只有DE,确认这一层只有两个元素DE
    代码如下
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
		if(root==null) {
			return result;
		}
        
        LinkedList<TreeNode> unUseNodes = new LinkedList<TreeNode>();
        unUseNodes.addLast(root);
        while(unUseNodes.size()>0) {
        	int nowSize = unUseNodes.size();
        	ArrayList<Integer> list = new ArrayList<Integer>();
        	for(int i = 0; i < nowSize; i++) {
        		TreeNode now = unUseNodes.removeFirst();
        		list.add(now.val);
        		if(now.left!=null) {
        			unUseNodes.addLast(now.left);
        		}
        		if(now.right!=null) {
        			unUseNodes.addLast(now.right);
        		}
        	}
        	result.add(list);
        }
        return result;
    }
}

同学原先问的问题是,给定一棵二叉树,求二叉树从右边看去,看到的元素的值,其实就是问的一棵二叉树层次遍历以后每一行的最后一个元素

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值