Skip to content

Commit 90470ac

Browse files
committed
199
1 parent 06ed261 commit 90470ac

File tree

3 files changed

+86
-3
lines changed

3 files changed

+86
-3
lines changed

SUMMARY.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@
102102
* [98. Validate Binary Search Tree](leetCode-98-Validate-Binary-Search-Tree.md)
103103
* [99. Recover Binary Search Tree](leetcode-99-Recover-Binary-Search-Tree.md)
104104
* [100. Same Tree](leetcode-100-Same-Tree.md)
105-
* [101 题到 198](leetcode-101-200.md)
105+
* [101 题到 199](leetcode-101-200.md)
106106
* [101. Symmetric Tree](leetcode-101-Symmetric-Tree.md)
107107
* [102. Binary Tree Level Order Traversal](leetcode-102-Binary-Tree-Level-Order-Traversal.md)
108108
* [103. Binary Tree Zigzag Level Order Traversal](leetcode-103-Binary-Tree-Zigzag-Level-Order-Traversal.md)
@@ -176,4 +176,5 @@
176176
* [189. Rotate Array](leetcode-189-Rotate-Array.md)
177177
* [190. Reverse Bits](leetcode-190-Reverse-Bits.md)
178178
* [191. Number of 1 Bits](leetcode-191-Number-of-1-Bits.md)
179-
* [198. House Robber](leetcode-198-House-Robber.md)
179+
* [198. House Robber](leetcode-198-House-Robber.md)
180+
* [199. Binary Tree Right Side View](leetcode-199-Binary-Tree-Right-Side-View.md)

leetcode-101-200.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -144,4 +144,6 @@
144144

145145
<a href="leetcode-191-Number-of-1-Bits.html">191. Number of 1 Bits</a>
146146

147-
<a href="leetcode-198-House-Robber.html">198. House Robber</a>
147+
<a href="leetcode-198-House-Robber.html">198. House Robber</a>
148+
149+
<a href="leetcode-199-Binary-Tree-Right-Side-View.html">199. Binary Tree Right Side View</a>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# 题目描述(中等难度)
2+
3+
![](https://windliang.oss-cn-beijing.aliyuncs.com/199.jpg)
4+
5+
给一个二叉树,然后想象自己站在二叉树右边向左边看过去,返回从上到下看到的数字序列。
6+
7+
# 解法一
8+
9+
题目意思再说的直白一些,就是依次输出二叉树每层最右边的元素。
10+
11+
每层最右边,可以想到二叉树的层次遍历,我们只需要保存每层遍历的最后一个元素即可。
12+
13+
二叉树的层次遍历在 [102 题](https://leetcode.wang/leetcode-102-Binary-Tree-Level-Order-Traversal.html) 已经做过了,代码拿过来用就可以。
14+
15+
我们只需要用一个队列,每次保存下层的元素即可。
16+
17+
```java
18+
public List<Integer> rightSideView(TreeNode root) {
19+
Queue<TreeNode> queue = new LinkedList<TreeNode>();
20+
List<Integer> res = new LinkedList<>();
21+
if (root == null)
22+
return res;
23+
queue.offer(root);
24+
while (!queue.isEmpty()) {
25+
int levelNum = queue.size(); // 当前层元素的个数
26+
for (int i = 0; i < levelNum; i++) {
27+
TreeNode curNode = queue.poll();
28+
//只保存当前层的最后一个元素
29+
if (i == levelNum - 1) {
30+
res.add(curNode.val);
31+
}
32+
if (curNode.left != null) {
33+
queue.offer(curNode.left);
34+
}
35+
if (curNode.right != null) {
36+
queue.offer(curNode.right);
37+
}
38+
39+
}
40+
}
41+
return res;
42+
}
43+
```
44+
45+
# 解法二
46+
47+
解法一的层次遍历是最直接的想法。我们也可以用深度优先遍历,在 [这里](https://leetcode.com/problems/binary-tree-right-side-view/discuss/56012/My-simple-accepted-solution(JAVA)) 看到的。
48+
49+
二叉树的深度优先遍历在之前也讨论过了, [94 题](https://leetcode.wang/leetCode-94-Binary-Tree-Inorder-Traversal.html) 的中序遍历、 [144 题](https://leetcode.wang/leetcode-144-Binary-Tree-Preorder-Traversal.html) 的先序遍历以及 [145 题](https://leetcode.wang/leetcode-145-Binary-Tree-Postorder-Traversal.html) 的后序遍历。
50+
51+
这里采用最简单的递归写法,并且优先从右子树开始遍历。
52+
53+
用一个变量记录当前层数,每次保存第一次到达该层的元素。
54+
55+
```java
56+
public List<Integer> rightSideView(TreeNode root) {
57+
List<Integer> res = new LinkedList<>();
58+
rightSideViewHelper(root, 0, res);
59+
return res;
60+
}
61+
62+
private void rightSideViewHelper(TreeNode root, int level, List<Integer> res) {
63+
if (root == null) {
64+
return;
65+
}
66+
//res.size() 的值理解成当前在等待的层级数
67+
//res.size() == 0, 在等待 level = 0 的第一个数
68+
//res.size() == 1, 在等待 level = 1 的第一个数
69+
//res.size() == 2, 在等待 level = 2 的第一个数
70+
if (level == res.size()) {
71+
res.add(root.val);
72+
}
73+
rightSideViewHelper(root.right, level + 1, res);
74+
rightSideViewHelper(root.left, level + 1, res);
75+
}
76+
```
77+
78+
#
79+
80+
这道题其实本质上就是考了二叉树的层次遍历和深度优先遍历。

0 commit comments

Comments
 (0)