Skip to content

Commit 07d5320

Browse files
authored
feat: add solutions to lc problem: No.0117 (doocs#1919)
No.0117.Populating Next Right Pointers in Each Node II
1 parent ff2e8d5 commit 07d5320

File tree

4 files changed

+371
-86
lines changed

4 files changed

+371
-86
lines changed

solution/0100-0199/0117.Populating Next Right Pointers in Each Node II/README.md

+143-37
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ struct Node {
6161

6262
**方法一:BFS**
6363

64-
使用队列进行层序遍历,每次遍历一层时,将当前层的节点按顺序连接起来。
64+
我们使用队列 $q$ 进行层序遍历,每次遍历一层时,将当前层的节点按顺序连接起来。
6565

6666
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树的节点个数。
6767

@@ -71,7 +71,7 @@ struct Node {
7171

7272
定义两个指针 $prev$ 和 $next$,分别指向下一层的前一个节点和第一个节点。遍历当前层的节点时,把下一层的节点串起来,同时找到下一层的第一个节点。当前层遍历完后,把下一层的第一个节点 $next$ 赋值给 $node$,继续遍历。
7373

74-
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为二叉树的节点个数
74+
时间复杂度 $O(n)$,其中 $n$ 为二叉树的节点个数。空间复杂度 $O(1)$。
7575

7676
<!-- tabs:start -->
7777

@@ -438,8 +438,6 @@ func connect(root *Node) *Node {
438438

439439
### **TypeScript**
440440

441-
BFS:
442-
443441
```ts
444442
/**
445443
* Definition for Node.
@@ -458,28 +456,28 @@ BFS:
458456
*/
459457

460458
function connect(root: Node | null): Node | null {
461-
if (root == null) {
462-
return root;
459+
if (!root) {
460+
return null;
463461
}
464-
const queue = [root];
465-
while (queue.length !== 0) {
466-
const n = queue.length;
467-
let pre = null;
468-
for (let i = 0; i < n; i++) {
469-
const node = queue.shift();
470-
node.next = pre;
471-
pre = node;
462+
const q: Node[] = [root];
463+
while (q.length) {
464+
const nq: Node[] = [];
465+
let p: Node | null = null;
466+
for (const node of q) {
467+
if (p) {
468+
p.next = node;
469+
}
470+
p = node;
472471
const { left, right } = node;
473-
right && queue.push(right);
474-
left && queue.push(left);
472+
left && nq.push(left);
473+
right && nq.push(right);
475474
}
475+
q.splice(0, q.length, ...nq);
476476
}
477477
return root;
478478
}
479479
```
480480

481-
DFS:
482-
483481
```ts
484482
/**
485483
* Definition for Node.
@@ -497,32 +495,140 @@ DFS:
497495
* }
498496
*/
499497

500-
const find = (root: Node | null): Node | null => {
501-
if (root == null) {
502-
return root;
498+
function connect(root: Node | null): Node | null {
499+
const modify = (curr: Node | null): void => {
500+
if (!curr) {
501+
return;
502+
}
503+
next = next || curr;
504+
if (prev) {
505+
prev.next = curr;
506+
}
507+
prev = curr;
508+
};
509+
let node = root;
510+
let [prev, next] = [null, null];
511+
while (node) {
512+
while (node) {
513+
modify(node.left);
514+
modify(node.right);
515+
node = node.next;
516+
}
517+
node = next;
518+
[prev, next] = [null, null];
503519
}
504-
const { left, right, next } = root;
505-
return left || right || find(next);
506-
};
520+
return root;
521+
}
522+
```
507523

508-
function connect(root: Node | null): Node | null {
509-
if (root == null) {
524+
### **C#**
525+
526+
```cs
527+
/*
528+
// Definition for a Node.
529+
public class Node {
530+
public int val;
531+
public Node left;
532+
public Node right;
533+
public Node next;
534+
535+
public Node() {}
536+
537+
public Node(int _val) {
538+
val = _val;
539+
}
540+
541+
public Node(int _val, Node _left, Node _right, Node _next) {
542+
val = _val;
543+
left = _left;
544+
right = _right;
545+
next = _next;
546+
}
547+
}
548+
*/
549+
550+
public class Solution {
551+
public Node Connect(Node root) {
552+
if (root == null) {
553+
return null;
554+
}
555+
var q = new Queue<Node>();
556+
q.Enqueue(root);
557+
while (q.Count > 0) {
558+
Node p = null;
559+
for (int i = q.Count; i > 0; --i) {
560+
var node = q.Dequeue();
561+
if (p != null) {
562+
p.next = node;
563+
}
564+
p = node;
565+
if (node.left != null) {
566+
q.Enqueue(node.left);
567+
}
568+
if (node.right != null) {
569+
q.Enqueue(node.right);
570+
}
571+
}
572+
}
510573
return root;
511574
}
512-
const { left, right, next } = root;
513-
if (left != null) {
514-
if (right != null) {
515-
left.next = right;
516-
} else {
517-
left.next = find(next);
575+
}
576+
```
577+
578+
```cs
579+
/*
580+
// Definition for a Node.
581+
public class Node {
582+
public int val;
583+
public Node left;
584+
public Node right;
585+
public Node next;
586+
587+
public Node() {}
588+
589+
public Node(int _val) {
590+
val = _val;
591+
}
592+
593+
public Node(int _val, Node _left, Node _right, Node _next) {
594+
val = _val;
595+
left = _left;
596+
right = _right;
597+
next = _next;
598+
}
599+
}
600+
*/
601+
602+
public class Solution {
603+
private Node prev, next;
604+
605+
public Node Connect(Node root) {
606+
Node node = root;
607+
while (node != null) {
608+
prev = null;
609+
next = null;
610+
while (node != null) {
611+
modify(node.left);
612+
modify(node.right);
613+
node = node.next;
614+
}
615+
node = next;
518616
}
617+
return root;
519618
}
520-
if (right != null) {
521-
right.next = find(next);
619+
620+
private void modify(Node curr) {
621+
if (curr == null) {
622+
return;
623+
}
624+
if (next == null) {
625+
next = curr;
626+
}
627+
if (prev != null) {
628+
prev.next = curr;
629+
}
630+
prev = curr;
522631
}
523-
connect(right);
524-
connect(left);
525-
return root;
526632
}
527633
```
528634

0 commit comments

Comments
 (0)