@@ -61,7 +61,7 @@ struct Node {
61
61
62
62
** 方法一:BFS**
63
63
64
- 使用队列进行层序遍历 ,每次遍历一层时,将当前层的节点按顺序连接起来。
64
+ 我们使用队列 $q$ 进行层序遍历 ,每次遍历一层时,将当前层的节点按顺序连接起来。
65
65
66
66
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树的节点个数。
67
67
@@ -71,7 +71,7 @@ struct Node {
71
71
72
72
定义两个指针 $prev$ 和 $next$,分别指向下一层的前一个节点和第一个节点。遍历当前层的节点时,把下一层的节点串起来,同时找到下一层的第一个节点。当前层遍历完后,把下一层的第一个节点 $next$ 赋值给 $node$,继续遍历。
73
73
74
- 时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为二叉树的节点个数 。
74
+ 时间复杂度 $O(n)$,其中 $n$ 为二叉树的节点个数。 空间复杂度 $O(1)$。
75
75
76
76
<!-- tabs:start -->
77
77
@@ -438,8 +438,6 @@ func connect(root *Node) *Node {
438
438
439
439
### ** TypeScript**
440
440
441
- BFS:
442
-
443
441
``` ts
444
442
/**
445
443
* Definition for Node.
@@ -458,28 +456,28 @@ BFS:
458
456
*/
459
457
460
458
function connect(root : Node | null ): Node | null {
461
- if (root == null ) {
462
- return root ;
459
+ if (! root ) {
460
+ return null ;
463
461
}
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 ;
472
471
const { left, right } = node ;
473
- right && queue .push (right );
474
- left && queue .push (left );
472
+ left && nq .push (left );
473
+ right && nq .push (right );
475
474
}
475
+ q .splice (0 , q .length , ... nq );
476
476
}
477
477
return root ;
478
478
}
479
479
```
480
480
481
- DFS:
482
-
483
481
``` ts
484
482
/**
485
483
* Definition for Node.
@@ -497,32 +495,140 @@ DFS:
497
495
* }
498
496
*/
499
497
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 ];
503
519
}
504
- const { left, right, next } = root ;
505
- return left || right || find ( next );
506
- };
520
+ return root ;
521
+ }
522
+ ```
507
523
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
+ }
510
573
return root ;
511
574
}
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 ;
518
616
}
617
+ return root ;
519
618
}
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 ;
522
631
}
523
- connect (right );
524
- connect (left );
525
- return root ;
526
632
}
527
633
```
528
634
0 commit comments