LeetCode 199 侧面观察二叉树(java)

该博客主要解析LeetCode第199题,即侧面观察二叉树问题。博主分析了题目要求,即层次遍历并输出每一层的最后一个节点。文章中,博主提供了Java代码解决方案,讨论了使用ArrayList和LinkedList的区别,并详细解释了如何通过队列实现层次遍历,特别是如何找到每层的最右节点。

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

一、题目

题目分析:

侧面观察二叉树,将观察到的节点从上到下依次输出-->也就是层次遍历二叉树,输出每一层的最后一个节点 

二、

java代码

 

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List <Integer> nodes =new ArrayList<Integer>();
        if(root==null){
            return nodes;
        }
        bfs(root, nodes)//广度搜索
        return nodes;
    }
    public void bfs(TreeNode root, List<Integer> nodes){
        Queue<TreeNode> currentLevel= new LinkedList<TreeNode>();
        currentLevel.add(root);
        while(!currentLevel.isEmpty()){//当前层不为空
            int size=currentLevel.size();//当前层结点个数+上一层遗留的最后一个节点
            for(int i=0;i<size-1;i++){//遍历size-1次,留下上一层最后一个节点
                TreeNode currentNode=currentLevel.poll();
                if(currentNode.left!=null)//后续节点继续加入
                    currentLevel.add(currentNode.left);
                if(currentNode.right!=null)
                    currentLevel.add(currentNode.right);
            }
            TreeNode lastnode=currentLevel.poll();//这个就是上一层的最后一个节点
            nodes.add(lastnode.val);
            if(lastnode.left!=null)
                currentLevel.add(lastnode.left);
            if(lastnode.right!=null)
                currentLevel.add(lastnode.right);
        }
    }
}

分析:

其实最容易想到的是,保存每一层的节点,然后输出最后一个节点就可以了

关于什么时候用arraylist 什么时候用linkedlist,前者是基于数组的数据结构,后者是基于链表的数据结构。前者查询较快,后者增删改较快。

Queue<TreeNode> currentLevel= new LinkedList<TreeNode>();

队列是先进先出,所以poll的是头的位置

要么记录每层有几个节点,定义一个num值,然后弹一个节点,记录后续左右孩子,直到num值定位到最右节点加入到nodes里面

本题采用的是,每一次都将每层的最右节点留下来,然后下一层的节点依次加入到queue里面,然后弹出queue的头,也就是上一层的最右节点,这种做法比较机智哦,但感觉还是记录num个数更好想

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值