@@ -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
460458function 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