Populating Next Right Pointers in Each Node II
描述
Follow up for problem "Populating Next Right Pointers in Each Node".
What if the given tree could be any binary tree? Would your previous solution still work?
Note: You may only use constant extra space.
For example, Given the following binary tree,
1
/ \
2 3
/ \ \
4 5 7
After calling your function, the tree should look like:
1 -> NULL
/ \
2 -> 3 -> NULL
/ \ \
4-> 5 -> 7 -> NULL
分析
要处理一个节点,可能需要最右边的兄弟节点,首先想到用广搜。但广搜不是常数空间的,本题要求常数空间。
注意,这题的代码原封不动,也可以解决 Populating Next Right Pointers in Each Node I.
递归版
- Python
- Java
- C++
// Populating Next Right Pointers in Each Node II
// 时间复杂度O(n),空间复杂度O(1)
public class Solution {
public void connect(TreeLinkNode root) {
if (root == null) return;
TreeLinkNode dummy = new TreeLinkNode(-1);
for (TreeLinkNode curr = root, prev = dummy;
curr != null; curr = curr.next) {
if (curr.left != null){
prev.next = curr.left;
prev = prev.next;
}
if (curr.right != null){
prev.next = curr.right;
prev = prev.next;
}
}
connect(dummy.next);
}
}
// Populating Next Right Pointers in Each Node II
// 时 间复杂度O(n),空间复杂度O(1)
class Solution {
public:
void connect(TreeLinkNode *root) {
if (root == nullptr) return;
TreeLinkNode dummy(-1);
for (TreeLinkNode *curr = root, *prev = &dummy;
curr; curr = curr->next) {
if (curr->left != nullptr){
prev->next = curr->left;
prev = prev->next;
}
if (curr->right != nullptr){
prev->next = curr->right;
prev = prev->next;
}
}
connect(dummy.next);
}
};
# Populating Next Right Pointers in Each Node II
# 时间复杂度O(n),空间复杂度O(1)
class Solution:
def connect(self, root):
if not root:
return
dummy = TreeLinkNode(-1)
curr, prev = root, dummy
while curr:
if curr.left:
prev.next = curr.left
prev = prev.next
if curr.right:
prev.next = curr.right
prev = prev.next
curr = curr.next
self.connect(dummy.next)
迭代版
- Java
- C++
// Populating Next Right Pointers in Each Node II
// 时间复杂度O(n),空间复杂度O(1)
public class Solution {
public void connect(TreeLinkNode root) {
while (root!= null ) {
TreeLinkNode next = null; // the first node of next level
TreeLinkNode prev = null; // previous node on the same level
for (; root != null; root = root.next) {
if (next == null) next = root.left != null ? root.left : root.right;
if (root.left != null) {
if (prev != null) prev.next = root.left;
prev = root.left;
}
if (root.right != null) {
if (prev != null) prev.next = root.right;
prev = root.right;
}
}
root = next; // turn to next level
}
}
}
// Populating Next Right Pointers in Each Node II
// 时间复杂度O(n),空间复杂度O(1)
class Solution {
public:
void connect(TreeLinkNode *root) {
while (root) {
TreeLinkNode * next = nullptr; // the first node of next level
TreeLinkNode * prev = nullptr; // previous node on the same level
for (; root; root = root->next) {
if (!next) next = root->left ? root->left : root->right;
if (root->left) {
if (prev) prev->next = root->left;
prev = root->left;
}
if (root->right) {
if (prev) prev->next = root->right;
prev = root->right;
}
}
root = next; // turn to next level
}
}
};
# Populating Next Right Pointers in Each Node II
# 时间复杂度O(n),空间复杂度O(1)
def connect(root):
while root:
next = None # the first node of next level
prev = None # previous node on the same level
while root:
if not next:
next = root.left if root.left else root.right
if root.left:
if prev:
prev.next = root.left
prev = root.left
if root.right:
if prev:
prev.next = root.right
prev = root.right
root = root.next
root = next # turn to next level