Skip to content

Commit f159332

Browse files
authored
feat: add solutions to lcci problems: No.04.03,04.04 (#1064)
* No.04.03.List of Depth * No.04.04.Check Balance
1 parent 22e6363 commit f159332

14 files changed

+556
-363
lines changed

lcci/04.03.List of Depth/README.md

+69-83
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,11 @@
2828

2929
<!-- 这里可写通用的实现逻辑 -->
3030

31-
层序遍历。
31+
**方法一:BFS 层序遍历**
32+
33+
我们可以使用 BFS 层序遍历的方法,每次遍历一层,将当前层的节点值存入链表中,然后将链表加入到结果数组中。
34+
35+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树的节点数。
3236

3337
<!-- tabs:start -->
3438

@@ -44,30 +48,28 @@
4448
# self.left = None
4549
# self.right = None
4650

47-
4851
# Definition for singly-linked list.
4952
# class ListNode:
5053
# def __init__(self, x):
5154
# self.val = x
5255
# self.next = None
56+
57+
5358
class Solution:
5459
def listOfDepth(self, tree: TreeNode) -> List[ListNode]:
55-
q = [tree]
5660
ans = []
61+
q = deque([tree])
5762
while q:
58-
n = len(q)
59-
head = ListNode(-1)
60-
tail = head
61-
for i in range(n):
62-
front = q.pop(0)
63-
node = ListNode(front.val)
64-
tail.next = node
65-
tail = node
66-
if front.left:
67-
q.append(front.left)
68-
if front.right:
69-
q.append(front.right)
70-
ans.append(head.next)
63+
dummy = cur = ListNode(0)
64+
for _ in range(len(q)):
65+
node = q.popleft()
66+
cur.next = ListNode(node.val)
67+
cur = cur.next
68+
if node.left:
69+
q.append(node.left)
70+
if node.right:
71+
q.append(node.right)
72+
ans.append(dummy.next)
7173
return ans
7274
```
7375

@@ -95,26 +97,24 @@ class Solution:
9597
*/
9698
class Solution {
9799
public ListNode[] listOfDepth(TreeNode tree) {
98-
Queue<TreeNode> queue = new LinkedList<>();
99-
queue.offer(tree);
100100
List<ListNode> ans = new ArrayList<>();
101-
while (!queue.isEmpty()) {
102-
int n = queue.size();
103-
ListNode head = new ListNode(-1);
104-
ListNode tail = head;
105-
for (int i = 0; i < n; i++) {
106-
TreeNode front = queue.poll();
107-
ListNode node = new ListNode(front.val);
108-
tail.next = node;
109-
tail = node;
110-
if (front.left != null) {
111-
queue.offer(front.left);
101+
Deque<TreeNode> q = new ArrayDeque<>();
102+
q.offer(tree);
103+
while (!q.isEmpty()) {
104+
ListNode dummy = new ListNode(0);
105+
ListNode cur = dummy;
106+
for (int k = q.size(); k > 0; --k) {
107+
TreeNode node = q.poll();
108+
cur.next = new ListNode(node.val);
109+
cur = cur.next;
110+
if (node.left != null) {
111+
q.offer(node.left);
112112
}
113-
if (front.right != null) {
114-
queue.offer(front.right);
113+
if (node.right != null) {
114+
q.offer(node.right);
115115
}
116116
}
117-
ans.add(head.next);
117+
ans.add(dummy.next);
118118
}
119119
return ans.toArray(new ListNode[0]);
120120
}
@@ -145,29 +145,23 @@ class Solution {
145145
public:
146146
vector<ListNode*> listOfDepth(TreeNode* tree) {
147147
vector<ListNode*> ans;
148-
if (tree == nullptr) {
149-
return ans;
150-
}
151-
queue<TreeNode*> q;
152-
q.push(tree);
148+
queue<TreeNode*> q{{tree}};
153149
while (!q.empty()) {
154-
int n = q.size();
155-
ListNode* head = new ListNode(-1);
156-
ListNode* tail = head;
157-
for (int i = 0; i < n; ++i) {
158-
TreeNode* front = q.front();
150+
ListNode* dummy = new ListNode(0);
151+
ListNode* cur = dummy;
152+
for (int k = q.size(); k; --k) {
153+
TreeNode* node = q.front();
159154
q.pop();
160-
ListNode* node = new ListNode(front->val);
161-
tail->next = node;
162-
tail = node;
163-
if (front->left != nullptr) {
164-
q.push(front->left);
155+
cur->next = new ListNode(node->val);
156+
cur = cur->next;
157+
if (node->left) {
158+
q.push(node->left);
165159
}
166-
if (front->right != nullptr) {
167-
q.push(front->right);
160+
if (node->right) {
161+
q.push(node->right);
168162
}
169163
}
170-
ans.push_back(head->next);
164+
ans.push_back(dummy->next);
171165
}
172166
return ans;
173167
}
@@ -192,30 +186,26 @@ public:
192186
* Next *ListNode
193187
* }
194188
*/
195-
func listOfDepth(tree *TreeNode) []*ListNode {
196-
queue := make([]*TreeNode, 0)
197-
queue = append(queue, tree)
198-
ans := make([]*ListNode, 0)
199-
for len(queue) > 0 {
200-
n := len(queue)
201-
head := new(ListNode)
202-
tail := head
203-
for i := 0; i < n; i++ {
204-
front := queue[0]
205-
queue = queue[1:]
206-
node := &ListNode{Val: front.Val}
207-
tail.Next = node
208-
tail = node
209-
if front.Left != nil {
210-
queue = append(queue, front.Left)
189+
func listOfDepth(tree *TreeNode) (ans []*ListNode) {
190+
q := []*TreeNode{tree}
191+
for len(q) > 0 {
192+
dummy := &ListNode{}
193+
cur := dummy
194+
for k := len(q); k > 0; k-- {
195+
node := q[0]
196+
q = q[1:]
197+
cur.Next = &ListNode{Val: node.Val}
198+
cur = cur.Next
199+
if node.Left != nil {
200+
q = append(q, node.Left)
211201
}
212-
if front.Right != nil {
213-
queue = append(queue, front.Right)
202+
if node.Right != nil {
203+
q = append(q, node.Right)
214204
}
215205
}
216-
ans = append(ans, head.Next)
206+
ans = append(ans, dummy.Next)
217207
}
218-
return ans
208+
return
219209
}
220210
```
221211

@@ -249,25 +239,21 @@ func listOfDepth(tree *TreeNode) []*ListNode {
249239
*/
250240

251241
function listOfDepth(tree: TreeNode | null): Array<ListNode | null> {
252-
const res = [];
253-
if (tree == null) {
254-
return res;
255-
}
256-
const queue = [tree];
257-
while (queue.length !== 0) {
258-
const n = queue.length;
242+
const ans: Array<ListNode | null> = [];
243+
const q: Array<TreeNode | null> = [tree];
244+
while (q.length) {
259245
const dummy = new ListNode();
260246
let cur = dummy;
261-
for (let i = 0; i < n; i++) {
262-
const { val, left, right } = queue.shift();
263-
left && queue.push(left);
264-
right && queue.push(right);
247+
for (let k = q.length; k; --k) {
248+
const { val, left, right } = q.shift()!;
265249
cur.next = new ListNode(val);
266250
cur = cur.next;
251+
left && q.push(left);
252+
right && q.push(right);
267253
}
268-
res.push(dummy.next);
254+
ans.push(dummy.next);
269255
}
270-
return res;
256+
return ans;
271257
}
272258
```
273259

0 commit comments

Comments
 (0)