二叉树的右视图

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 }

 

posted @ 2022-04-16 20:20  r1-12king  阅读(256)  评论(0编辑  收藏  举报