美文网首页
LeetCode 114 Flatten Binary Tree

LeetCode 114 Flatten Binary Tree

作者: ShuiLocked | 来源:发表于2016-08-26 11:39 被阅读63次

    LeetCode 114 Flatten Binary Tree to Linked List

    Given a binary tree, flatten it to a linked list in-place.

    Hints:
    If you notice carefully in the flattened tree, each node's right child points to the next node of a pre-order traversal.

    我以为我可以秒了tree遍历相关的题目。。。然而我还是天真了。。。特别是对应什么时候应该直接dfs,什么时候要写helper函数进行dfs这个问题,老是无法将intuition转化成code。。。

    真的还需要多练习。。。有点心累。。。

    思路挺简单的,但我一开始纠结于node情况的分类,其实分类非常简单!!!
    只要判断左儿子是否为空就可以了!!!
    左儿子不为空则插入到node与右儿子之间!!!
    左儿子为空则直接return!!!

    当然还有一个问题!!!
    到底在什么时候调用递归函数???

    按照前序中序后序遍历,调用递归的位置各不相同。
    那这道题如hint所示,最终的形态与前序结果相同,那是不是应该在最开始操作,然后再调用递归呢?

    思考后发现还是略有不同!

    本题要做的操作是这样的:
    首先希望左子树与右子树都已经被flatten,在此基础上,判断左儿子,然后决定如何重构root与root.left和root.right的关系。

    这么看来,就应该先flatten(root.left),再flatten(root.right),最后再重构root和root.left和root.right。

    重构时有一个trick就是,必须先iteration找到左儿子最右侧的leaf,然后将这个leaf.next设为root.right。

    在判断是可以用node!=null && node.next!=null这个条件,判断node=null这个corner case!!!

    代码:

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

    相关文章

      网友评论

          本文标题:LeetCode 114 Flatten Binary Tree

          本文链接:https://www.haomeiwen.com/subject/fwxzsttx.html