題目:
給定一個二叉樹
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);
}
}