思路:
先查看左右子树是否都不为空,直接左子.next —>右子
左不为空,但右为空,无法直接赋值,借助getNext递归函数,传入父节点的next。
右不为空(此时无论左是否为空不受影响),无法直接赋值,借助getNext递归函数,传入父节点的next。
至于为什么先递归root.right,原理如下:
// 先确保 root.right 下的节点的已完全连接,因 root.left 下的节点的连接
// 需要 root.left.next 下的节点的信息,若 root.right 下的节点未完全连
// 接(即先对 root.left 递归),则 root.left.next 下的信息链不完整,将
// 返回错误的信息。可能出现的错误情况如下图所示。此时,底层最左边节点将无
// 法获得正确的 next 信息:
// o root
// / \
// root.left o —— o root.right
// / / \
// o —— o o
// / / \
// o o o
递归函数getNext不在讲解。
源码如下:
public Node connect(Node root) {
if(root==null)return root;
if(root.left!=null && root.right!=null)root.left.next=root.right;
if(root.left!=null && root.right==null)root.left.next=getNext(root.next);
if(root.right!=null)root.right.next=getNext(root.next);
connect(root.right);
connect(root.left);
return root;
}
public Node getNext(Node root){
if(root==null)return root;
if(root.left!=null)return root.left;
if(root.right!=null)return root.right;
if(root.next!=null)return getNext(root.next);
return null;
}