「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战」。
原题目链接:199. 二叉树的右视图
题目描述
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]
由示例可以看出题目所说的是我们求出二叉树的右视图,也即是每一层的左右边的节点的值,首先我们应该先了解什么是二叉树。
二叉树
二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分 [1] 。
二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点。
二叉树常见遍历方法
遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。常见的遍历方式有以下三种:
先序遍历(根左右)
从根节点出发,先访问该节点元素,然后再依次遍历各节点的左右子树,直到当前节点左右子树遍历完成后,简单记为根左右。
中序遍历(左根右)
从根节点出发,先遍历节点的左子树,直到左子树遍历完成后访问该节点的元素,最后再遍历右子树,简单记为左根右。
后续遍历(左右根)
从根节点出发,依次遍历各节点的左右子树,直到当前节点左右子树遍历完成后,才访问该节点元素,简单记为左右根。
题解
回归原话题,求解该题目可以选用上面任一遍历方法,每次遍历子树时记录该子树的层数,使用一个数组记录每一层节点的值,不断更新,最后得到的即为二叉树的右视图,具体代码如下:
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var rightSideView = function(root) {
let res = [];
if(root == null) return res;
function dfs(r,t){
if(res.length < t) res.push([]);
res[t-1]=r.val;
if(r.left) dfs(r.left,t+1);
if(r.right) dfs(r.right,t+1);
}
dfs(root,1);
return res;
};