114. Flatten Binary Tree to Linked List

来源:互联网 发布:linux 刻录文件 编辑:程序博客网 时间:2024/06/06 04:45

解法一:递归解法,非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;        }    }}
0 0