作者:disappearedgod
时间:2014-6-6
题目
Given a binary tree, flatten it to a linked list in-place.
For example,
Given
1 / \ 2 5 / \ \ 3 4 6The flattened tree should look like:
1 \ 2 \ 3 \ 4 \ 5 \ 6
Hints:
If you notice carefully in the flattened tree, each node's right child points to the next node of a pre-order traversal.
解法
错误想法
一种错误的想法是:用前序遍历(根,左,右)然后每次改变根的左面到右面。
这种想法的忽略了根右面的子树的存放位置。(稍微改动即可)
错误的想法是直接用new TreeNode(root.val):这里不让使用额外的空间。
正确想法
一种想法就是按照list一样操作。
每次找到根节点第一个左节点外最右节点Node,把root.right赋值给Node.right后,将root的左边改到右边去(这里注意要清空root的左边,赋值!=移动)。
public class Solution {
public void flatten(TreeNode root) {
if(root==null)
return;
TreeNode t = root;
while(t.right!=null || t.left!=null){
change(t);
t = t.right;
}
}
public void change(TreeNode root){
if(root.left == null)
return;
TreeNode left = root.left;
TreeNode Node = left;
while(Node.right!=null){
Node = Node.right;
}
Node.right = root.right;
root.right = root.left;
root.left = null;
}
}