给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

    struct Node {
    int val;
    Node left;
    Node
    right;
    Node *next;
    }
    填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。

    初始状态下,所有 next 指针都被设置为 NULL。

    示例 1:
    image.png
    输入:root = [1,2,3,4,5,6,7]
    输出:[1,#,2,3,#,4,5,6,7,#]
    解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,’#’ 标志着每一层的结束。
    示例 2:

    输入:root = []
    输出:[]

    1. /**
    2. * // Definition for a Node.
    3. * function Node(val, left, right, next) {
    4. * this.val = val === undefined ? null : val;
    5. * this.left = left === undefined ? null : left;
    6. * this.right = right === undefined ? null : right;
    7. * this.next = next === undefined ? null : next;
    8. * };
    9. */
    10. /**
    11. * @param {Node} root
    12. * @return {Node}
    13. */
    14. var connect = function (root) {
    15. // 二叉树的递归分为「遍历」和「分解问题」两种思维模式,这道题需要用到「遍历」的思维。
    16. if (!root) return null;
    17. // 链接节点
    18. const traverse = (leftNode, rightNode) => {
    19. if (leftNode === null || rightNode === null) {
    20. return;
    21. }
    22. // 将传入的两个节点穿起来
    23. leftNode.next = rightNode;
    24. // 连接相同父节点的两个子节点
    25. traverse(leftNode.left, leftNode.right);
    26. traverse(rightNode.left, rightNode.right);
    27. // 连接跨越父节点的两个子节点
    28. traverse(leftNode.right, rightNode.left);
    29. }
    30. traverse(root.left, root.right);
    31. return root;
    32. };

    image.png