题目描述:
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-tree-right-side-view 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例1:
输入: [1,2,3,null,5,null,4] 输出: [1, 3, 4] 解释: 1 <--- / \ 2 3 <--- \ \ 5 4 <---
题目难度:中等
分析:
使用深度优先搜索(dfs)从右边遍历树的每一个节点,那么每一层最先遍历到的值就是从右侧所能看见的节点值。代码如下:
java:
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public List<Integer> rightSideView(TreeNode root) { List<Integer> res = new ArrayList<>(); // 根节点为第0层,tier表示当前遍历的层级 dfs(root, res, 0); return res; } private void dfs(TreeNode root, List<Integer> res, int tier) { // 当前节点为null说明肯定没有叶子节点,就可以停止搜索 if (root == null) { return; } // 由题意可知,每层都会有且仅有一个值会被“看见” // 所以当res.size() == tier的时候,就说明这是这一层第一个被“看见的”值 if (res.size() == tier) { res.add(root.val); } // 层次加一,按照右子节点-->左子节点遍历 tier++; dfs(root.right, res, tier); dfs(root.left, res, tier); } }
python:
# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def rightSideView(self, root: TreeNode) -> List[int]: res = [] self.dfs(root, res, 0) return res def dfs(self, root: TreeNode, res: List[int], tier: int) -> None: if root is None: return if len(res) == tier: res.append(root.val) tier += 1 self.dfs(root.right, res, tier) self.dfs(root.left, res, tier)
总结:
时间复杂度为O(N)。也可以使用bfs做层序遍历(代码省略)。