Skip to content

Commit 73ec62a

Browse files
committed
二刷199
1 parent 02f300e commit 73ec62a

File tree

5 files changed

+104
-18
lines changed

5 files changed

+104
-18
lines changed

docs/0199-binary-tree-right-side-view.adoc

Lines changed: 58 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,87 @@
11
[#0199-binary-tree-right-side-view]
2-
= 199. Binary Tree Right Side View
2+
= 199. 二叉树的右视图
33

4-
{leetcode}/problems/binary-tree-right-side-view/[LeetCode - Binary Tree Right Side View^]
4+
https://leetcode.cn/problems/binary-tree-right-side-view/[LeetCode - 199. 二叉树的右视图 ^]
55

6-
Given a binary tree, imagine yourself standing on the _right_ side of it, return the values of the nodes you can see ordered from top to bottom.
6+
给定一个二叉树的 *根节点* `root`,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
77

8-
*Example:*
8+
*示例 1:*
99

10-
[subs="verbatim,quotes,macros"]
11-
----
12-
*Input:* [1,2,3,null,5,null,4]
13-
*Output:* [1, 3, 4]
14-
*Explanation:
15-
*
10+
image::images/0199-01.jpg[{image_attr}]
11+
12+
....
13+
输入: [1,2,3,null,5,null,4]
14+
输出: [1,3,4]
15+
解释:
1616
1 <---
1717
/ \
1818
2 3 <---
1919
\ \
2020
5 4 <---
21-
----
21+
....
22+
23+
*示例 2:*
24+
25+
....
26+
输入: [1,null,3]
27+
输出: [1,3]
28+
....
29+
30+
*示例 3:*
31+
32+
....
33+
输入: []
34+
输出: []
35+
....
36+
37+
*提示:*
38+
39+
* 二叉树的节点个数的范围是 `[0, 100]`
40+
* `+-100 <= Node.val <= 100+`
2241
2342
2443
== 思路分析
2544

2645
最简单的思路就是利用 BFS 思想进行分层遍历,然后每层取最后一个节点的值。
2746

47+
深度优先遍历,按照 `<level, node>` 的格式,把每个节点都放到 `Map` 里,因为是先左后右,所以,每层最后只剩下了最右边的元素。
48+
2849
[[src-0199]]
50+
[tabs]
51+
====
52+
一刷::
53+
+
54+
--
2955
[{java_src_attr}]
3056
----
3157
include::{sourcedir}/_0199_BinaryTreeRightSideView.java[tag=answer]
3258
----
59+
--
3360
34-
这道题是 xref:0102-binary-tree-level-order-traversal.adoc[102. Binary Tree Level Order Traversal] 的延伸。
35-
36-
== 思考题
37-
38-
这道题也可以使用深度优先遍历,思考如何实现?
39-
61+
一刷(深度优先)::
62+
+
63+
--
4064
[{java_src_attr}]
4165
----
4266
include::{sourcedir}/_0199_BinaryTreeRightSideView_1.java[tag=answer]
4367
----
68+
--
69+
70+
二刷::
71+
+
72+
--
73+
[{java_src_attr}]
74+
----
75+
include::{sourcedir}/_0199_BinaryTreeRightSideView_2.java[tag=answer]
76+
----
77+
--
78+
====
79+
80+
这道题是 xref:0102-binary-tree-level-order-traversal.adoc[102. Binary Tree Level Order Traversal] 的延伸。
81+
82+
== 思考题
83+
84+
* [x] 这道题也可以使用深度优先遍历,思考如何实现?见上面代码。
4485

4586
== 参考资料
4687

docs/images/0199-01.jpg

14.5 KB
Loading

logbook/202503.adoc

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -593,11 +593,21 @@ endif::[]
593593
|{doc_base_url}/1530-number-of-good-leaf-nodes-pairs.adoc[题解]
594594
|⭕️ 还有瑕疵,还需要继续优化。
595595

596-
|{counter:codes}
596+
|{counter:codes2503}
597597
|{leetcode_base_url}/remove-zero-sum-consecutive-nodes-from-linked-list/[1171. 从链表中删去总和值为零的连续节点^]
598598
|{doc_base_url}/1171-remove-zero-sum-consecutive-nodes-from-linked-list.adoc[题解]
599599
|❌ 前缀和。想到了前缀和,但是没想到可以利用中间和为 `0`,直接跳过这部分节点。
600600

601+
|{counter:codes2503}
602+
|{leetcode_base_url}/best-time-to-buy-and-sell-stock-iii/[123. 买卖股票的最佳时机 III^]
603+
|{doc_base_url}/0123-best-time-to-buy-and-sell-stock-iii.adoc[题解]
604+
|❌ 动态规划。思路还需要多揣摩和思考。
605+
606+
|{counter:codes2503}
607+
|{leetcode_base_url}/binary-tree-right-side-view/[199. 二叉树的右视图^]
608+
|{doc_base_url}/0199-binary-tree-right-side-view.adoc[题解]
609+
|✅ 深度优先遍历。按照 `<level, node>` 的格式,把每个节点都放到 `Map` 里,因为是先左后右,所以,每层最后只剩下了最右边的元素。
610+
601611
|===
602612

603613
截止目前,本轮练习一共完成 {codes2503} 道题。

src/main/java/com/diguage/algo/leetcode/_0199_BinaryTreeRightSideView_1.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ public class _0199_BinaryTreeRightSideView_1 {
1212
// tag::answer[]
1313
/**
1414
* 参考 https://leetcode.cn/problems/binary-tree-right-side-view/solutions/2015061/ru-he-ling-huo-yun-yong-di-gui-lai-kan-s-r1nc/[199. 二叉树的右视图 - 【视频】如何灵活运用递归?^]
15+
*
16+
* @author D瓜哥 · https://www.diguage.com
17+
* @since 2024-06-25 14:44:16
1518
*/
1619
public List<Integer> rightSideView(TreeNode root) {
1720
List<Integer> result = new ArrayList<>();
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.diguage.algo.leetcode;
2+
3+
import com.diguage.algo.util.TreeNode;
4+
5+
import java.util.ArrayList;
6+
import java.util.HashMap;
7+
import java.util.List;
8+
import java.util.Map;
9+
10+
public class _0199_BinaryTreeRightSideView_2 {
11+
// tag::answer[]
12+
13+
/**
14+
* @author D瓜哥 · https://www.diguage.com
15+
* @since 2025-05-04 21:45:49
16+
*/
17+
public List<Integer> rightSideView(TreeNode root) {
18+
Map<Integer, Integer> levelToNode = new HashMap<>();
19+
dfs(root, 0, levelToNode);
20+
return new ArrayList<>(levelToNode.values());
21+
}
22+
23+
private void dfs(TreeNode root, int level, Map<Integer, Integer> levelToNode) {
24+
if (root == null) {
25+
return;
26+
}
27+
levelToNode.put(level, root.val);
28+
dfs(root.left, level + 1, levelToNode);
29+
dfs(root.right, level + 1, levelToNode);
30+
}
31+
// end::answer[]
32+
}

0 commit comments

Comments
 (0)