这两个题的解法1非常类似,起始116完全可以看成是117题的一种特例情况,因此只需要解决了117题,116题便手到擒来了。
题目要求将树的每一层的节点连接起来,因此最直观的方法便是利用层序遍历将树的每一层节点遍历出来,然后根据顺序将每层节点连接起来即可。层序遍历需要利用队列来实现,不符合题目要求的O(1)空间复杂度。
利用递归实现,对于每一个节点,我们可以先判断一下他的左、右子节点的情况,若都为空,则退出递归,若都不为空,则令左子节点连接到右子节点,若只有一个子节点不为空,则利用自定义的getNext() 方法寻找下一个节点。
getNext() 方法通过while循环遍历当前节点所处层次的所有节点,前提是该层的连接已建立,然后判断下一个节点的左、右子节点是否存在,直到找到下一个子节点并返回。
class Solution {
public Node connect(Node root) {
if(root == null || (root.left==null && root.right == null)){
return root;
}
if(root.right!= null && root.left != null){
root.left.next = root.right;
root.right.next = getNext(root);
}
if(root.left == null){
root.right.next = getNext(root);
}
if(root.right == null){
root.left.next = getNext(root);
}
connect(root.right);
connect(root.left);
return root;
}
private Node getNext(Node root){
while(root.next != null){
if(root.next.left!=null){
return root.next.left;
}
if(root.next.right != null){
return root.next.right;
}
root = root.next;
}
return null;
}
}
116题由于是完全二叉树,所有不需要判断一个节点的左、右子节点是否为空。
class Solution {
public Node connect(Node root) {
if(root == null || root.left == null){
return root;
}
root.left.next = root.right;
if(root.next != null){
root.right.next = root.next.left;
}
connect(root.right);
connect(root.left);
return root;
}
}