Skip to content

Commit 67b4229

Browse files
committed
feat: add solutions to lc problems: No.0199,0201
* No.0199.Binary Tree Right Side View * No.0201.Bitwise AND of Numbers Range
1 parent 7245eeb commit 67b4229

File tree

12 files changed

+505
-132
lines changed

12 files changed

+505
-132
lines changed

solution/0100-0199/0199.Binary Tree Right Side View/README.md

Lines changed: 206 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,17 @@
4646

4747
<!-- 这里可写通用的实现逻辑 -->
4848

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$ 为二叉树节点个数。
5060

5161
<!-- tabs:start -->
5262

@@ -62,19 +72,41 @@
6272
# self.left = left
6373
# self.right = right
6474
class Solution:
65-
def rightSideView(self, root: TreeNode) -> List[int]:
75+
def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
6676
ans = []
6777
if root is None:
6878
return ans
6979
q = deque([root])
7080
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)):
7383
node = q.popleft()
74-
if node.right:
75-
q.append(node.right)
7684
if node.left:
7785
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)
78110
return ans
79111
```
80112

@@ -104,17 +136,17 @@ class Solution {
104136
if (root == null) {
105137
return ans;
106138
}
107-
Deque<TreeNode> q = new LinkedList<>();
108-
q.offerLast(root);
139+
Deque<TreeNode> q = new ArrayDeque<>();
140+
q.offer(root);
109141
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();
116145
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);
118150
}
119151
}
120152
}
@@ -123,6 +155,43 @@ class Solution {
123155
}
124156
```
125157

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+
126195
### **C++**
127196

128197
```cpp
@@ -141,22 +210,60 @@ class Solution {
141210
public:
142211
vector<int> rightSideView(TreeNode* root) {
143212
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}};
146217
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) {
149220
TreeNode* node = q.front();
150221
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+
}
153228
}
154229
}
155230
return ans;
156231
}
157232
};
158233
```
159234
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+
160267
### **Go**
161268

162269
```go
@@ -168,26 +275,51 @@ public:
168275
* Right *TreeNode
169276
* }
170277
*/
171-
func rightSideView(root *TreeNode) []int {
172-
var ans []int
278+
func rightSideView(root *TreeNode) (ans []int) {
173279
if root == nil {
174-
return ans
280+
return
175281
}
176282
q := []*TreeNode{root}
177283
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-- {
180286
node := q[0]
181287
q = q[1:]
182-
if node.Right != nil {
183-
q = append(q, node.Right)
184-
}
185288
if node.Left != nil {
186289
q = append(q, node.Left)
187290
}
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
188314
}
315+
if depth == len(ans) {
316+
ans = append(ans, node.Val)
317+
}
318+
dfs(node.Right, depth+1)
319+
dfs(node.Left, depth+1)
189320
}
190-
return ans
321+
dfs(root, 0)
322+
return
191323
}
192324
```
193325

@@ -209,21 +341,53 @@ func rightSideView(root *TreeNode) []int {
209341
*/
210342

211343
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;
215347
}
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);
224356
}
225357
}
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;
227391
}
228392
```
229393

0 commit comments

Comments
 (0)