echo

任生命穿梭 时间的角落

0%

二叉树的右视图

199. 二叉树的右视图

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例:

1
2
3
4
5
6
7
8
9
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:

1 <---
/ \
2 3 <---
\ \
5 4 <---

第一感觉就是用层次遍历,保存每一层的最后一个结点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* 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<>();
if(root == null) return res;
//层次遍历使用的队列
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while(! queue.isEmpty()){
// len 为层次遍历时每一层的结点个数
int len = queue.size();
for(int i=0; i<len; i++){
TreeNode t = queue.poll();
// 是否为最后一个结点
if(i == len-1){
res.add(t.val);
}
//将左右子结点加入队列
if(t.left != null) queue.add(t.left);
if(t.right != null) queue.add(t.right);
}
}
return res;
}
}

我们也可以模仿二叉树遍历,只是先遍历右子结点然后遍历左子结点。同时在遍历的过程中保存每一层的第一个结点值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* 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<>();
helper(root, 1, res);
return res;
}

private void helper(TreeNode root, int level, List<Integer> res){
if(root != null){
/*
假设二叉树深度为 i ,res 数组的大小为 i。
当 res.size() 小于当前访问的层数时就代表这是最右侧结点。
*/
if(res.size() < level){
res.add(root.val);
}
//先遍历右子结点
helper(root.right, level+1, res);
//后遍历左子结点
helper(root.left, level+1, res);
}
}
}