java 完美二叉树之填充每个节点的下一个右侧节点指针

  • Post author:
  • Post category:java


给定一个

完美二叉树

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

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为

NULL

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

NULL

示例:

引用图片

给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。

输入:


{
    "$id": "1",
    "left": {
        "$id": "2",
        "left": {
            "$id": "3",
            "left": null,
            "next": null,
            "right": null,
            "val": 4
        },
        "next": null,
        "right": {
            "$id": "4",
            "left": null,
            "next": null,
            "right": null,
            "val": 5
        },
        "val": 2
    },
    "next": null,
    "right": {
        "$id": "5",
        "left": {
            "$id": "6",
            "left": null,
            "next": null,
            "right": null,
            "val": 6
        },
        "next": null,
        "right": {
            "$id": "7",
            "left": null,
            "next": null,
            "right": null,
            "val": 7
        },
        "val": 3
    },
    "val": 1
}

输出:

{
    "$id": "1",
    "left": {
        "$id": "2",
        "left": {
            "$id": "3",
            "left": null,
            "next": {
                "$id": "4",
                "left": null,
                "next": {
                    "$id": "5",
                    "left": null,
                    "next": {
                        "$id": "6",
                        "left": null,
                        "next": null,
                        "right": null,
                        "val": 7
                    },
                    "right": null,
                    "val": 6
                },
                "right": null,
                "val": 5
            },
            "right": null,
            "val": 4
        },
        "next": {
            "$id": "7",
            "left": {
                "$ref": "5"
            },
            "next": null,
            "right": {
                "$ref": "6"
            },
            "val": 3
        },
        "right": {
            "$ref": "4"
        },
        "val": 2
    },
    "next": null,
    "right": {
        "$ref": "7"
    },
    "val": 1
}


提示:


你只能使用

常量级额外空间



使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。

以下解决方式:

/*
// Definition for a Node.
class Node {
    public int val;
    public Node left;
    public Node right;
    public Node next;

    public Node() {}
    
    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, Node _left, Node _right, Node _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
};
*/

class Solution {
    /**
    * 完美二叉树填充下一个右侧节点指针
    */
    public Node connect(Node root) {
        if (root == null) return null;
        // 记录上一个节点
        Node pre = null;
        // 当前操作的节点
        Node curr = root;
        // 记录当前层级开始的节点
        Node start = root;
        while (curr.left != null) {
            // 连接当前节点的左右节点
            curr.left.next = curr.right;
            // 判断是否已是当前层级结尾
            if (curr.next == null) {
                // 进入下一层级,初始操作节点,记录开始节点
                curr = start.left;
                start = curr;
            } else {
                // 记录当前节点为上一个节点
                pre = curr;
                // 当前节点进入下一个
                curr = pre.next;
                // 将上一个节点右节点与当前节点的左节点连接
                pre.right.next = curr.left;
            }
        }
        return root;
    }
}



版权声明:本文为qq_42120481原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。