Flatten binary tree to linked list

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

Solution I: using stack, pre order traversal

public class Solution {
    public void flatten(TreeNode root) {
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode p = root;

        while(p != null || !stack.empty()){

            if(p.right != null){
                stack.push(p.right);
            }

            if(p.left != null){
                p.right = p.left;
                p.left = null;
            }else if(!stack.empty()){
                TreeNode temp = stack.pop();
                p.right=temp;
            }

            p = p.right;
        }
    }
}

Solution II: in place

note the use of variable post

思路是先遍历右子树,然后左子树,最后根节点。这样的好处是遍历完一个子树后,子树里的所有左右孩子指针都不需要了。 递归调用返回该子树中第一个节点,用于后续调用的后继。

public class Solution {
  public void flatten(TreeNode root){
        if (root == null){
            return;
        }

        flat(root, null);
    }

    private TreeNode flat(TreeNode root, TreeNode post){
        if (root == null){
            return post;
        }
        TreeNode right = flat(root.right, post);
        TreeNode left = flat(root.left, right);
        root.right = left;
        root.left = null;
        return root;
    }
}