二叉树的右视图
199. 二叉树的右视图
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]
示例 2:输入: [1,null,3]
输出: [1,3]
示例 3:输入: []
输出: []
思路: 我们按照 「根结点 -> 右子树 -> 左子树」 的顺序访问,就可以保证每层都是最先访问最右边的节点的。
(与先序遍历 「根结点 -> 左子树 -> 右子树」 正好相反,先序遍历每层最先访问的是最左边的节点)
时间复杂度: O(N)O(N),每个节点都访问了 1 次。
空间复杂度: O(N)O(N),因为这不是一棵平衡二叉树,二叉树的深度最少是 logNlogN, 最坏的情况下会退化成一条链表,深度就是 NN,因此递归时使用的栈空间是 O(N)O(N) 的。
1 class Solution { 2 List<Integer> res = new ArrayList<>(); 3 4 public List<Integer> rightSideView(TreeNode root) { 5 dfs(root, 0); 6 return res; 7 } 8 9 public void dfs(TreeNode root, int depth){ 10 if(root == null){ 11 return; 12 } 13 if(depth == res.size()){ 14 res.add(root.val); 15 } 16 dfs(root.right, depth+1); 17 dfs(root.left, depth+1); 18 } 19 }
思考:其实我觉得这道题最有意思的是dfs 怎么计算第一次到达某一层,这里用结果集的大小来保证,很有意思
\
补一个宽度优先搜索:
1 class Solution { 2 public List<Integer> rightSideView(TreeNode root) { 3 List<Integer> res = new ArrayList<>(); 4 if (root == null){ 5 return res; 6 } 7 Deque<TreeNode> q = new LinkedList<>(); 8 q.add(root); 9 int len = 1; 10 while(!q.isEmpty()){ 11 int tem = 0; 12 for(int i=0; i<len; i++){ 13 TreeNode n = q.pollFirst(); 14 if(n.left !=null){ 15 q.add(n.left); 16 tem +=1; 17 } 18 if(n.right != null){ 19 q.add(n.right); 20 tem +=1; 21 } 22 if(i == len -1){ 23 res.add(n.val); 24 } 25 } 26 len = tem; 27 } 28 return res; 29 } 30 }