学习记录:js算法(五十):二叉树的右视图

二叉树的右视图

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

图一:
在这里插入图片描述

示例 1:如图一
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

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

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

我的思路
循环
网上思路
递归

我的思路

var rightSideView = function(root) {
    if (root === null) return [];
    
    let queue = [root];
    let result = [];
    
    while (queue.length > 0) {
        let size = queue.length;
        for (let i = 0; i < size; i++) {
            let currentNode = queue.shift();
            
            // 将左右子节点加入队列
            if (currentNode.left) queue.push(currentNode.left);
            if (currentNode.right) queue.push(currentNode.right);
            
            // 如果是当前层的最后一个节点,将其值加入结果数组
            if (i === size - 1) {
                result.push(currentNode.val);
            }
        }
    }
    
    return result;
};

讲解
要在二叉树中获取从右视图看到的节点值,我们可以使用层次遍历(广度优先搜索 BFS)的方法,同时跟踪每一层的最后一个节点。这样,我们就可以收集到每一层最右边的节点值。

  1. 初始化:创建一个队列 queue 并将根节点 root 加入队列。同时创建一个空数组 result 用于存放结果。
  2. 层次遍历:进行层次遍历,使用一个循环,只要队列不为空就一直运行。在每次循环开始时,记录当前队列的大小 size,这代表了当前层的节点数。
  3. 处理当前层节点:在当前层中,依次从队列中取出节点,将其左右子节点加入队列。同时,记录下当前层的最后一个节点的值,即为当前层的右视图节点。
  4. 更新结果:将当前层的右视图节点值添加到结果数组 result 中。
  5. 重复步骤3和4,直到队列为空,即所有节点都被处理完毕。
  6. 返回结果:返回结果数组 result,它包含了从右视图看到的节点值。

网上思路

var rightSideView = function (root) {
    const result = []; // 存储结果

    function dfs(node, level) {
        if (!node) return; // 如果节点为空,返回

        // 如果当前层级的结果数组没有值,说明是第一次访问这一层
        if (result.length === level) {
            result.push(node.val); // 记录当前节点的值
        }

        // 先遍历右子树,再遍历左子树
        dfs(node.right, level + 1);
        dfs(node.left, level + 1);
    }

    dfs(root, 0); // 从根节点开始DFS
    return result; // 返回从右侧看到的节点值
}

讲解

  1. rightSideView 函数:定义一个结果数组 result,并调用递归函数 dfs
  2. 递归函数 dfs
    • 检查当前节点是否为空,如果为空则返回。
    • 如果当前层级的结果数组还没有值,说明这是第一次访问这一层,将当前节点的值加入结果。
    • 先递归访问右子树,再访问左子树,以保证优先访问右侧节点。

总结

忘记递归的写法了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值