官方题解: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 1
head.left.next = head.right;
// CONNECTION 2
if (head.next != null) {
head.right.next = head.next.left;
}
// 指针向后移动
head = head.next;
}
// 去下一层的最左的节点
leftmost = leftmost.left;
}
return root;
}
}