*114J. Flatten Binary Tree to Linked List

https://leetcode.com/problems/flatten-binary-tree-to-linked-list/

Method Recursion

要求 in place

这是我自己写的,还算比较直观

class Solution {
    public void flatten(TreeNode root) {
        helper(root);
    }
    public TreeNode helper(TreeNode root){
        if(root == null) return null;
        TreeNode left = helper(root.left);
        TreeNode right = helper(root.right);
        TreeNode pL = left;
        if(left!= null){
            while(pL.right!=null){
                pL = pL.right;
            }
            root.left = null;
            root.right = left;
            pL.right = right;
        }
        return root;
    }
}

还有一种写法,也比较直观。

class Solution {
    public void flatten(TreeNode root) {
        if(root == null) return;
        TreeNode L = root.left;
        TreeNode R = root.right;
        root.left = null;
        root.right = null;
        if(L != null) {
            root.right = L;
            flatten(L);
        }
        if(R != null) {
            while(root.right != null) {
                root = root.right;
            }
            root.right = R;
            flatten(R);
        }
    }
}

这是从讨论中学到的,全局变量+顺时针的postorder。给跪了。
post order 对于一个 subtree 
比如 a.left = b, a.right = c 来说
处理的顺序是 b c a (逆时针) 或者 c b a (顺时针)
也就是说 ** post order 先处理子节点再处理父节点!**

而这题我们就要这样。c b a 的处理。
prev = c, 所以 b.right = prev; b.left = null;
然后令 prev = b; 下一轮处理 a 的时候就有 a.right = prev;
a.left = null; prev = root.

补充:
这个题要的顺序是逆时针的preorder,正序处理的话不好处理,
如果逆序,从最后一位开始处理的话,那就好处理了。
这时我们就注意到,顺时针的postorder遍历的顺序恰恰就是
逆序的逆时针的preorder。所以我们就想出了如下的顺时针postorder解法。
private TreeNode prev = null;

public void flatten(TreeNode root) {
    if (root == null)
        return;
    flatten(root.right);
    flatten(root.left);
    root.right = prev;
    root.left = null;
    prev = root;
}

上面的解法不能解决全局变量能否重用的问题,做一个小的改变。

class Solution {
    public void flatten(TreeNode root) {
        TreeNode prev = null;
        helper(root, prev);
    }
    public TreeNode helper(TreeNode root, TreeNode prev){
        if(root == null) return prev;
        prev = helper(root.right,prev);
        prev = helper(root.left,prev);
        root.right = prev;
        root.left = null;
        prev = root;
        return prev;
    }
}

Last updated

Was this helpful?