解法一:递归解法,非in place
public class Solution {
//return the head and tail of flatten tree
public TreeNode flattenTree(TreeNode root){
TreeNode left = null, right = null;
TreeNode tail = root;
if (root.left != null){
left = flattenTree(root.left);
}
root.left = null;
if (root.right != null){
right = flattenTree(root.right);
}
if (left != null){
tail.right = left;
while(tail.right != null) tail = tail.right;
}
if (right != null){
tail.right = right;
while(tail.right != null) tail = tail.right;
}
return root;
}
public void flatten(TreeNode root) {
if (root != null)
flattenTree(root);
}
}
更优的解法:基于Morris Traversal(http://www.cnblogs.com/AnnieKim/archive/2013/06/15/MorrisTraversal.html)
public class Solution {
public void flatten(TreeNode root) {
//Morris Traversal
TreeNode cur = root;
TreeNode former = null;
while(cur != null){
if (cur.left != null){
former = cur.left;
while(former.right != null && former.right != cur)
former = former.right;
//first cur, then whole (cur.left), last whole(cur.right), now former is the last of whole(cur.left)
//therefore, whole(cur.right) would be placed after former. And let cur.left be cur.right
former.right = cur.right;
cur.right = cur.left;
cur.left = null;
}
cur = cur.right;
}
}
}