leetcode笔记——199二叉树的右视图

题目:

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例:

输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:

   1            <---
 /   \
2     3         <---
 \     \
  5     4       <---

思路:在网上找的大神的代码,原文链接:https://blog.csdn.net/mine_song/article/details/70213524

刚开始我理解错了,以为右视图就是右子树的所有右节点,实际上并不是,是每一层最右边的节点。使用广度优先搜索,对树进行层次遍历,记录每一层最右边的节点。

这个我再做的时候理解对了,想到使用层次遍历,记录每一层的节点个数,将最后一个节点加入到结果中。但是对于层次遍历我还是不怎么熟。。。这个要在看看。

代码:

public List<Integer> rightSideView(TreeNode root) {
        List<Integer> ret = new ArrayList<>();
        if (root == null)
            return ret;
        bfs(root, ret);
        return ret;
    }
    
    private void bfs(TreeNode root, List<Integer> ret) {
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root);
        // 层次遍历,只需要记录本层结点个数即可
        int curNum = 1;
        // 下一层的节点数
        int nextNum = 0;
        while (!q.isEmpty()) {
            TreeNode node = q.poll();
            if (curNum == 1)
                ret.add(node.val);
            curNum--;
            if (node.left != null) {
                q.offer(node.left);
                nextNum++;
            }
            if (node.right != null) {
                q.offer(node.right);
                nextNum++;
            }
            if (curNum == 0) {
                curNum = nextNum;
                nextNum = 0;
            }
        }
    }
 

执行最快的代码:

这个好像是前序遍历递归解法,当level等于size的时候说明是最右边的节点,直接接入就可以。

class Solution {
        private List<Integer> result = new ArrayList<>();

    public List<Integer> rightSideView(TreeNode root) {
        getList(root, 0);
        return result;
    }

    private void getList(TreeNode node, int level) {
        if (node != null) {
            if (level >= result.size()) {
                result.add(node.val);
            }
            level++;
            getList(node.right, level);
            getList(node.left, level);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值