官方题解:LeetCode官方题解
解题思想:
因为是一棵满二叉树,所以除了叶子节点外的其他节点都有两个子节点。
可以根据每一层来依次遍历
从根节点开始,根节点的左子节点的next节点就指向根节点的右子节点
因为根节点的next节点为NULL,开始从根节点的下一层的最左边的节点开始遍历。
如图所示,值为2的节点的左子节点的next节点为其右子节点,此时判断2的节点的next节点是否为NULL,如果不为NULL,值为2的节点的next节点为值为3的节点,且值为2的节点的右子节点的next节点为值为3的节点的左子节点。
如果值为2的节点的next节点为NULL,则从其下一层的最左边的节点开始重新遍历。
如果当前节点为叶子节点,且其next节点为NULL,则终止遍历并返回。
代码:
/*
// 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 root;}// 从根节点开始Node leftmost = root;while (leftmost.left != null) {// 遍历这一层节点组织成的链表,为下一层的节点更新 next 指针Node head = leftmost;while (head != null) {// CONNECTION 1head.left.next = head.right;// CONNECTION 2if (head.next != null) {head.right.next = head.next.left;}// 指针向后移动head = head.next;}// 去下一层的最左的节点leftmost = leftmost.left;}return root;}
}