虾皮高频编程考题:二叉树的右视图(中等)

题目描述

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

示例 1:

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

示例 2:输入: [1,null,3] 输出: [1,3]

示例 3:输入: [] 输出: []

提示:

  • 二叉树的节点个数的范围是 [0,100]
  • -100 <= Node.val <= 100 

解题思路

要从二叉树的右侧查看并返回节点值,我们可以使用层序遍历(广度优先遍历)来实现。具体来说,我们需要从右侧依次访问每一层的节点,并从每一层的最右侧节点开始返回结果。

  1. 层序遍历

    使用一个队列来实现层序遍历;遍历每一层的节点时,记录每层的最后一个节点值,因为它代表了从右侧可以看到的节点;将每一层的节点值添加到结果列表中。
  2. 实现步骤

    • 初始化一个队列,将根节点加入队列。
    • 对于每一层,记录层的节点数(即队列的当前大小)。
    • 遍历该层的所有节点,并更新队列(将当前节点的左子节点和右子节点加入队列)。
    • 记录每层最后一个节点的值(即右侧可见节点)。
    • 返回结果列表。

复杂度分析

  • 时间复杂度O(n),其中 n 是树中的节点数。每个节点被访问一次。
  • 空间复杂度O(w),其中 w 是树的最大宽度(即队列中最大的元素数)。在最坏的情况下,队列的大小等于树的最大宽度。

代码实现

package org.zyf.javabasic.letcode.hot100.tree;

import org.zyf.javabasic.letcode.tree.base.TreeNode;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * @program: zyfboot-javabasic
 * @description: 二叉树的右视图(中等)
 * @author: zhangyanfeng
 * @create: 2024-08-22 11:53
 **/
public class RightSideViewSolution {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if (root == null) {
            return result;
        }

        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);

        while (!queue.isEmpty()) {
            int levelSize = queue.size();
            Integer rightMostValue = null;

            for (int i = 0; i < levelSize; i++) {
                TreeNode node = queue.poll();
                rightMostValue = node.val;

                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }

            result.add(rightMostValue);
        }

        return result;
    }

    public static void main(String[] args) {
        RightSideViewSolution solution = new RightSideViewSolution();

        // Example 1
        TreeNode root1 = new TreeNode(1);
        root1.left = new TreeNode(2);
        root1.right = new TreeNode(3);
        root1.left.right = new TreeNode(5);
        root1.right.right = new TreeNode(4);
        System.out.println(solution.rightSideView(root1));  // Output: [1, 3, 4]

        // Example 2
        TreeNode root2 = new TreeNode(1);
        root2.right = new TreeNode(3);
        System.out.println(solution.rightSideView(root2));  // Output: [1, 3]

        // Example 3
        TreeNode root3 = null;
        System.out.println(solution.rightSideView(root3));  // Output: []
    }
}

  具体可见:LeetCode 热题 100 回顾_leetcode热题100-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值