题目:
给定一个二叉树
struct TreeLinkNode {
TreeLinkNode *left;
TreeLinkNode *right;
TreeLinkNode *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL
。
初始状态下,所有 next 指针都被设置为 NULL
。
说明:
- 你只能使用额外常数空间。
- 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
示例:
给定二叉树,
1
/ \
2 3
/ \ \
4 5 7
调用你的函数后,该二叉树变为:
1 -> NULL
/ \
2 -> 3 -> NULL
/ \ \
4-> 5 -> 7 -> NULL
思路:网上找的大神的代码,但是还是有些看不懂,先记在这里。
这个题与116题的区别在于116题中的是一个完美二叉树。左右节点都存在,这个就只是一个普通的二叉树了。题目中要求使用额外的常数空间。
代码1,先记录下来,这个代码和下面最快代码的时间相同。
class Solution {
public Node connect(Node root) {
Node queue = root;
Node level = new Node(0);
while (queue != null) {
level.next = null;
Node current = level;
while (queue != null) {
if (queue.left != null) {
current.next = queue.left;
current = current.next;
}
if (queue.right != null) {
current.next = queue.right;
current = current.next;
}
queue = queue.next;
}
queue = level.next;
}
return root;
}
}
代码2: 执行最快的代码
这个是leetcode中最快的代码,可以理解。这个最快的代码应该是常数级的空间。最快的代码我可以自己写出来,但是要注意黑体的部分小心写错。
class Solution {
public Node connect(Node root) {
helper(root);
return root;
}
void helper(Node node){
if(node == null)return;
Node next = null;
if(node.left != null){
if(node.right != null){
node.left.next = node.right;
}else{
next = node.next;
while(next != null){
if(next.left != null){
node.left.next = next.left;
break;
}else if(next.right != null){
node.left.next = next.right;
break;
}
next = next.next;
}
}
}
if(node.right != null){
next = node.next;
while(next != null){
if(next.left != null){
node.right.next = next.left;
break;
}else if(next.right != null){
node.right.next = next.right;
break;
}
next = next.next;
}
}
helper(node.right);
helper(node.left);
}
}