LeetCode 114 Flatten Binary Tree to Linked List

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 to Linked List)