Flatten Binary Tree to Linked List
Given a binary tree, flatten it to a linked list in-place.
For example,
Given
1 / \ 2 5 / \ \ 3 4 6
The flattened tree should look like:
1 \ 2 \ 3 \ 4 \ 5 \ 6分析:问题可以看做是将左子树弄平,加到root和又子树之间。实现细节是:用一个指针p,首先判断左子树是否为空,若为空则p指向p.right,若不为空,再判断p.right 是否为空,若为空则将p.left移到p.right,若不为空,用tempRight ,tempLeft 保存p的左右结点,然后flatten(p.left),之后将tempLeft加到p.right, 然后while循环找出左子树的最后一个treenode,将tempright再加到那个treenode下面。
代码:
public class Solution {
public void flatten (TreeNode root) {
if (root == null) {
return;
}
TreeNode p = root;
while (p != null) {
if (p.left == null) {
p = p.right;
} else {
if (p.right == null) {
TreeNode temp = p.left;
p.left = null;
p.right = temp;
p = p.right;
} else {
TreeNode tempRight = p.right;
TreeNode tempLeft = p.left;
flatten(p.left);
p.left = null;
p.right = tempLeft;
while (p.right != null) {
p = p.right;
}
p.right = tempRight;
}
}
}
}
}