Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 07d5320

Browse files
feat: add solutions to lc problem: No.0117 (#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‎

Lines changed: 143 additions & 37 deletions
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-
returnleft||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)

AltStyle によって変換されたページ (->オリジナル) /