js 算法题一:二叉树的右视图
题目:
给定一个二叉树的 根节点 root
,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
示例 1:
输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 示例 2: 输入: [1,null,3] 输出: [1,3] 示例 3: 输入: [] 输出: []
提示:
- 二叉树的节点个数的范围是
[0,100]
-100 <= Node.val <= 100
方法一:思路:通过层序遍历的方式,将树转换成二维数组,然后取每一层的最后一个节点
/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } */ /** * @param {TreeNode} root * @return {number[]} */ var rightSideView = function(root) { let res = []; if(!root) return res; const treeNode = [root]; while(treeNode.length){ // 该层级上所有节点内容组成的数组放入res res.push(treeNode.map(item=>item.val)) const temp = []; for(const item of treeNode){ item.left&&temp.push(item.left) item.right && temp.push(item.right) } // 先删除后压入 treeNode.splice(0,Infinity, ...temp); } return res.map(item=>item.pop()) };
方法二:遍历节点的时候,记录当前节点的层数,然后将结果放进一个数组里,
注意点一:先放右节点,,当该层下标的数组不存,放进去。
注意点二:当res[level] = 0时,注意判断条件的边界线
/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } */ /** * @param {TreeNode} root * @return {number[]} */ var rightSideView = function(root) { const res = []; if(!root)return res; const diguiFun = (nodeTree,level)=>{ // 因为 res[level] 为0 时,这时 !res[level] 依旧是true,就把0覆盖了 if(res[level] === undefined) res.push(nodeTree.val) nodeTree.right && diguiFun(nodeTree.right,level+1) nodeTree.left && diguiFun(nodeTree.left,level+1) } diguiFun(root,0); return res };