二叉树的右视图(JS)

题目描述

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
在这里插入图片描述

题目分析

首先根据题目意思,可以判断出这一道考察二叉树知识的题。那么相对于二叉树的知识,你还记得多少呢?层次遍历、先序遍历、中序遍历、后序遍历、广度游戏、深度优先等等,相信这些你应该都有些印象,如果不是特别清楚,那么建议去复习一下,或者学习一下【过来人的感叹啊】。
1、解法一:
(1)、层次遍历:每一层一层的遍历,找到每层最后一个元素,并将元素加入到结果集中(我们很文明的,不提倡暴力)
(2)、广度优先遍历:根据观看的特点,我们知道每一层我们只能获得一个值,那么每一层的深度与结果集的长度有什么关系呢?所获取的数据位置有什么特点呢?好好开动你的大脑。好吧,确实有点不好发现。其实我们可以观察到只要右子树还有节点,那么左子树就可以不先进行查找,同时当我们在右子树上获取我们需要的元素时,当第一个数据所在的深度与结果集的长度相等时,它是不是我们需要的数据呢?
下面我们来看几张图:相信它比我更会说
(1)首先,我们可以观察到这个二叉树中,当结果集合的长度为0时,当前二叉树的深度也为0,即当前的数据为根节点,那么从右边看过来,自然它是我们需要的,那么加入到结果集合中(结果集长度为 1 ),根据右边的节点是我们所获取的数据的可能性更大,所以我们先遍历右子树。

在这里插入图片描述

(2)、第一层数据以获取,那么我们根据获取数据的特性,我们先遍历右子树,此时指向右子树,此时满足深度为1 ,结果集长度也为1 ,那么加入到结果集(长度为2),进行优先遍历右子树

在这里插入图片描述

(3)、还能往右子树进行遍历,那么此刻的只要是右子树的右节点上都满足此条件:当前结果集长度和树的深度相等时,那么当前数据,就是我们所获取的数据。

在这里插入图片描述

(4)、当获取完当前节点后,发现没有了右子树了,那么下一层所获取的数据节点一定在该节点的左子树上,或者根节点的左子树上,因此,我们可以发现,当遍历右子树完成之后,我们即可遍历左子树去获取新的数据节点。如下图,此时深度变为3,结果集合的长度也满足3,同观察此数据也为我们所需要的,那么将它加入到结果集合。(结果集合长度为4)

在这里插入图片描述

(5)、此时继续遍历,发现没有左右子节点了,结束了吗?没有,还有呢v!!!所以这时我们又开始遍历根节点的左子树,根据每层只能获取一个数据节点的特点,那么我们就可以直接从根节点跳到…

在这里插入图片描述

(6)、这时我们发现,对应的节点上具有左节点了,但是不具备右节点,同时根据观察,该节点的左节点,也满足所需要求,所以我们可以判断出,第一个数据节点的深度与数据集合的长度相等时,该数据节点即是,我们所需要的。概念太深奥了,我们还是喜欢代码。

在这里插入图片描述

整个过程是不是一个深度优先?还别说,真像。差点把人绕晕了。所以采用深度优先遍历和这个特性,我们就可以找到我们所需要的数据元素集合。
都说那里有深度,那里就有广度,其实这里也可以使用广度优先遍历进行实现。你可以试试?

实现代码

var rightSideView = function(root) {
    if(!root)
        return [];
    let arrList =[];
    DFS(root,0,arrList);
    return arrList;
};

function DFS(root,depth,res){
    if(root){
        if(res.length === depth){// 当数组长度等于当前 深度 时, 把当前的值加入数组
            res.push(root.val);
        }
        DFS(root.right,depth+1,res);// 先从右边开始, 当右边没了, 再轮到左边
        DFS(root.left,depth+1,res);
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值