46
46
47
47
<!-- 这里可写通用的实现逻辑 -->
48
48
49
- 层序遍历,取每层最后一个元素。
49
+ ** 方法一:BFS**
50
+
51
+ 使用 BFS 层序遍历二叉树,每层最后一个节点即为该层的右视图节点。
52
+
53
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树节点个数。
54
+
55
+ ** 方法二:DFS**
56
+
57
+ 使用 DFS 深度优先遍历二叉树,每次先遍历右子树,再遍历左子树,这样每层第一个遍历到的节点即为该层的右视图节点。
58
+
59
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树节点个数。
50
60
51
61
<!-- tabs:start -->
52
62
62
72
# self.left = left
63
73
# self.right = right
64
74
class Solution :
65
- def rightSideView (self , root : TreeNode) -> List[int ]:
75
+ def rightSideView (self , root : Optional[ TreeNode] ) -> List[int ]:
66
76
ans = []
67
77
if root is None :
68
78
return ans
69
79
q = deque([root])
70
80
while q:
71
- ans.append(q[0 ].val)
72
- for i in range (len (q), 0 , - 1 ):
81
+ ans.append(q[- 1 ].val)
82
+ for _ in range (len (q)):
73
83
node = q.popleft()
74
- if node.right:
75
- q.append(node.right)
76
84
if node.left:
77
85
q.append(node.left)
86
+ if node.right:
87
+ q.append(node.right)
88
+ return ans
89
+ ```
90
+
91
+ ``` python
92
+ # Definition for a binary tree node.
93
+ # class TreeNode:
94
+ # def __init__(self, val=0, left=None, right=None):
95
+ # self.val = val
96
+ # self.left = left
97
+ # self.right = right
98
+ class Solution :
99
+ def rightSideView (self , root : Optional[TreeNode]) -> List[int ]:
100
+ def dfs (node , depth ):
101
+ if node is None :
102
+ return
103
+ if depth == len (ans):
104
+ ans.append(node.val)
105
+ dfs(node.right, depth + 1 )
106
+ dfs(node.left, depth + 1 )
107
+
108
+ ans = []
109
+ dfs(root, 0 )
78
110
return ans
79
111
```
80
112
@@ -104,17 +136,17 @@ class Solution {
104
136
if (root == null ) {
105
137
return ans;
106
138
}
107
- Deque<TreeNode > q = new LinkedList <> ();
108
- q. offerLast (root);
139
+ Deque<TreeNode > q = new ArrayDeque <> ();
140
+ q. offer (root);
109
141
while (! q. isEmpty()) {
110
- ans. add(q. peekFirst(). val);
111
- for (int i = q. size(); i > 0 ; -- i) {
112
- TreeNode node = q. pollFirst();
113
- if (node. right != null ) {
114
- q. offerLast(node. right);
115
- }
142
+ ans. add(q. peekLast(). val);
143
+ for (int n = q. size(); n > 0 ; -- n) {
144
+ TreeNode node = q. poll();
116
145
if (node. left != null ) {
117
- q. offerLast(node. left);
146
+ q. offer(node. left);
147
+ }
148
+ if (node. right != null ) {
149
+ q. offer(node. right);
118
150
}
119
151
}
120
152
}
@@ -123,6 +155,43 @@ class Solution {
123
155
}
124
156
```
125
157
158
+ ``` java
159
+ /**
160
+ * Definition for a binary tree node.
161
+ * public class TreeNode {
162
+ * int val;
163
+ * TreeNode left;
164
+ * TreeNode right;
165
+ * TreeNode() {}
166
+ * TreeNode(int val) { this.val = val; }
167
+ * TreeNode(int val, TreeNode left, TreeNode right) {
168
+ * this.val = val;
169
+ * this.left = left;
170
+ * this.right = right;
171
+ * }
172
+ * }
173
+ */
174
+ class Solution {
175
+ private List<Integer > ans = new ArrayList<> ();
176
+
177
+ public List<Integer > rightSideView (TreeNode root ) {
178
+ dfs(root, 0 );
179
+ return ans;
180
+ }
181
+
182
+ private void dfs (TreeNode node , int depth ) {
183
+ if (node == null ) {
184
+ return ;
185
+ }
186
+ if (depth == ans. size()) {
187
+ ans. add(node. val);
188
+ }
189
+ dfs(node. right, depth + 1 );
190
+ dfs(node. left, depth + 1 );
191
+ }
192
+ }
193
+ ```
194
+
126
195
### ** C++**
127
196
128
197
``` cpp
@@ -141,22 +210,60 @@ class Solution {
141
210
public:
142
211
vector<int > rightSideView(TreeNode* root) {
143
212
vector<int > ans;
144
- if (!root) return ans;
145
- queue<TreeNode* > q {{root}};
213
+ if (!root) {
214
+ return ans;
215
+ }
216
+ queue<TreeNode* > q{{root}};
146
217
while (!q.empty()) {
147
- ans.push_back (q.front ()->val);
148
- for (int i = q.size(); i > 0 ; --i ) {
218
+ ans.emplace_back (q.back ()->val);
219
+ for (int n = q.size(); n ; --n ) {
149
220
TreeNode* node = q.front();
150
221
q.pop();
151
- if (node->right) q.push(node->right);
152
- if (node->left) q.push(node->left);
222
+ if (node->left) {
223
+ q.push(node->left);
224
+ }
225
+ if (node->right) {
226
+ q.push(node->right);
227
+ }
153
228
}
154
229
}
155
230
return ans;
156
231
}
157
232
};
158
233
```
159
234
235
+ ```cpp
236
+ /**
237
+ * Definition for a binary tree node.
238
+ * struct TreeNode {
239
+ * int val;
240
+ * TreeNode *left;
241
+ * TreeNode *right;
242
+ * TreeNode() : val(0), left(nullptr), right(nullptr) {}
243
+ * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
244
+ * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
245
+ * };
246
+ */
247
+ class Solution {
248
+ public:
249
+ vector<int> rightSideView(TreeNode* root) {
250
+ vector<int> ans;
251
+ function<void(TreeNode*, int)> dfs = [&](TreeNode* node, int depth) {
252
+ if (!node) {
253
+ return;
254
+ }
255
+ if (depth == ans.size()) {
256
+ ans.emplace_back(node->val);
257
+ }
258
+ dfs(node->right, depth + 1);
259
+ dfs(node->left, depth + 1);
260
+ };
261
+ dfs(root, 0);
262
+ return ans;
263
+ }
264
+ };
265
+ ```
266
+
160
267
### ** Go**
161
268
162
269
``` go
@@ -168,26 +275,51 @@ public:
168
275
* Right *TreeNode
169
276
* }
170
277
*/
171
- func rightSideView(root *TreeNode) []int {
172
- var ans []int
278
+ func rightSideView (root *TreeNode ) (ans []int ) {
173
279
if root == nil {
174
- return ans
280
+ return
175
281
}
176
282
q := []*TreeNode{root}
177
283
for len (q) > 0 {
178
- ans = append(ans, q[0 ].Val)
179
- for i := len(q); i > 0; i -- {
284
+ ans = append (ans, q[len (q)- 1 ].Val )
285
+ for n := len (q); n > 0 ; n -- {
180
286
node := q[0 ]
181
287
q = q[1 :]
182
- if node.Right != nil {
183
- q = append(q, node.Right)
184
- }
185
288
if node.Left != nil {
186
289
q = append (q, node.Left )
187
290
}
291
+ if node.Right != nil {
292
+ q = append (q, node.Right )
293
+ }
294
+ }
295
+ }
296
+ return
297
+ }
298
+ ```
299
+
300
+ ``` go
301
+ /* *
302
+ * Definition for a binary tree node.
303
+ * type TreeNode struct {
304
+ * Val int
305
+ * Left *TreeNode
306
+ * Right *TreeNode
307
+ * }
308
+ */
309
+ func rightSideView (root *TreeNode ) (ans []int ) {
310
+ var dfs func (*TreeNode, int )
311
+ dfs = func (node *TreeNode, depth int ) {
312
+ if node == nil {
313
+ return
188
314
}
315
+ if depth == len (ans) {
316
+ ans = append (ans, node.Val )
317
+ }
318
+ dfs (node.Right , depth+1 )
319
+ dfs (node.Left , depth+1 )
189
320
}
190
- return ans
321
+ dfs (root, 0 )
322
+ return
191
323
}
192
324
```
193
325
@@ -209,21 +341,53 @@ func rightSideView(root *TreeNode) []int {
209
341
*/
210
342
211
343
function rightSideView(root : TreeNode | null ): number [] {
212
- const res = [];
213
- if (root == null ) {
214
- return res ;
344
+ const ans = [];
345
+ if (! root ) {
346
+ return ans ;
215
347
}
216
- const queue = [root ];
217
- while (queue .length !== 0 ) {
218
- const n = queue .length ;
219
- res .push (queue [n - 1 ].val );
220
- for (let i = 0 ; i < n ; i ++ ) {
221
- const { left, right } = queue .shift ();
222
- left && queue .push (left );
223
- right && queue .push (right );
348
+ const q = [root ];
349
+ while (q .length ) {
350
+ const n = q .length ;
351
+ ans .push (q [n - 1 ].val );
352
+ for (let i = 0 ; i < n ; ++ i ) {
353
+ const { left, right } = q .shift ();
354
+ left && q .push (left );
355
+ right && q .push (right );
224
356
}
225
357
}
226
- return res ;
358
+ return ans ;
359
+ }
360
+ ```
361
+
362
+ ``` ts
363
+ /**
364
+ * Definition for a binary tree node.
365
+ * class TreeNode {
366
+ * val: number
367
+ * left: TreeNode | null
368
+ * right: TreeNode | null
369
+ * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
370
+ * this.val = (val===undefined ? 0 : val)
371
+ * this.left = (left===undefined ? null : left)
372
+ * this.right = (right===undefined ? null : right)
373
+ * }
374
+ * }
375
+ */
376
+
377
+ function rightSideView(root : TreeNode | null ): number [] {
378
+ const ans = [];
379
+ const dfs = (node : TreeNode | null , depth : number ) => {
380
+ if (! node ) {
381
+ return ;
382
+ }
383
+ if (depth == ans .length ) {
384
+ ans .push (node .val );
385
+ }
386
+ dfs (node .right , depth + 1 );
387
+ dfs (node .left , depth + 1 );
388
+ };
389
+ dfs (root , 0 );
390
+ return ans ;
227
391
}
228
392
```
229
393
0 commit comments