leetcode 116
    https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/
    116.png

    1. // BFS 实现
    2. func connect(root *Node) *Node {
    3. if root == nil {
    4. return root
    5. }
    6. roott := root
    7. queue := []*Node{}
    8. queue = append(queue,roott)
    9. for len(queue) >0 {
    10. length := len(queue)
    11. for length > 0 {
    12. length--
    13. roott = queue[0]
    14. queue = queue[1:]
    15. if roott.Left !=nil {
    16. queue = append(queue,roott.Left)
    17. }
    18. if roott.Right != nil {
    19. queue = append(queue,roott.Right)
    20. }
    21. if length ==0 {
    22. roott.Next = nil
    23. } else {
    24. roott.Next = queue[0]
    25. }
    26. }
    27. }
    28. return root
    29. }
    30. // 递归
    31. func connect(root *Node) *Node {
    32. if root == nil {
    33. return nil
    34. }
    35. l := root.Left
    36. r := root.Right
    37. for l != nil {
    38. l.Next = r //连接
    39. l = l.Right //往右
    40. r = r.Left //往左
    41. }
    42. connect(root.Left)
    43. connect(root.Right)
    44. return root
    45. }
    46. //迭代 空间复杂度O(1)
    47. func connect(root *Node) *Node {
    48. if root == nil {
    49. return nil
    50. }
    51. cur := root
    52. for cur != nil {
    53. dummy := &Node{} // 创建哑节点
    54. pre := dummy
    55. for cur != nil {
    56. if cur.Left != nil {
    57. pre.Next = cur.Left
    58. pre = pre.Next
    59. }
    60. if cur.Right != nil {
    61. pre.Next = cur.Right
    62. pre = pre.Next
    63. }
    64. cur = cur.Next
    65. }
    66. cur = dummy.Next
    67. }
    68. return root
    69. }
    70. // 迭代 左节点向右,右节点向左
    71. func connect(root *Node) *Node {
    72. if root == nil {
    73. return nil
    74. }
    75. pre := root
    76. for pre.Left != nil {
    77. parent := pre
    78. for parent != nil {
    79. parent.Left.Next = parent.Right //左节点连接右节点
    80. if parent.Next != nil {
    81. parent.Right.Next = parent.Next.Left //右节点 连接 邻居左节点
    82. }
    83. parent = parent.Next //同层移动
    84. }
    85. pre = pre.Left //移到下层
    86. }
    87. return root
    88. }

    leetcode 117
    https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/
    117.png

    // BFS 
    func connect(root *Node) *Node {
        if root == nil {
            return nil 
        }
        roott := root 
        queue := []*Node{} 
        queue = append(queue,roott)
    
        for len(queue) >0 {
            length := len(queue)
            for length >0 {
                length-- 
                cur := queue[0]
                queue = queue[1:]
    
                if cur.Left != nil {
                    queue = append(queue,cur.Left)
                }
                if cur.Right != nil {
                    queue = append(queue,cur.Right)
                }
                if length >0 {
                    cur.Next = queue[0]
                }
    
            }
        }
        return root 
    }
    
    
    //迭代 
    func connect(root *Node) *Node {
        if root == nil {
            return nil 
        }
        cur := root
    
        for cur != nil {
            dummy := &Node{}
            pre := dummy 
            for cur != nil {
                if cur.Left != nil {
                    pre.Next = cur.Left
                    pre = pre.Next 
                }
    
                if cur.Right != nil {
                    pre.Next = cur.Right
                    pre = pre.Next
                }
                cur = cur.Next 
            }
            cur = dummy.Next 
        }
        return root 
    }