思想:观察给定例子,发现看起来是通过先序遍历实现的,而且是通过right来构造链表节点的先后关系
但是直接使用先序遍历会照成右子树丢失,所以不能直接使用先序,那怎么办呢?既然要利用右孩子来存,所以我们既然现在要在遍历根节点之前先遍历右孩子而且还要最终结果中令每个节点的左孩子为空,那么我们在遍历根节点之前必须先去遍历右子树和左子树。那么右和左谁先遍历呢?因为实例中最终各节点的顺序是先序遍历的结果,那么我们是不是可以按先序的逆序来遍历,同时将构造右孩子的操作同样取反这样不就跟原先序遍历的结果一样了吗。也就是按右-》左-》根得顺序来遍历同时在构造右子域时令当前root.right = pre(同样这个构造的顺序也反过来,不再是先序时的做法:pre.right=root)然后令root.left = null(这里不会丢失左孩子,因为左孩子先遍历了)
时间复杂度O(n),空间复杂度O(logn)
class Solution {
TreeNode pre;
public void flatten(TreeNode root) {
if(root==null)return;
flatten(root.right);
flatten(root.left);
if(pre!=null){
root.right = pre;
}
root.left = null;
pre = root;
}
}