思路一
将每个结点的右子树插到其左子树的最右边的位置,然后将左子树换到右子树的位置,将左子树置空。
class Solution {
public void flatten(TreeNode root) {
if(root==null) return;
while(root!=null){
if(root.left==null){
root=root.right;
}else{
//找左子树的最右结点
TreeNode temp=root.left;
while(temp.right!=null)
temp=temp.right;
//将右子树查到左子树上
temp.right=root.right;
//左、右子树换位置
root.right=root.left;
//左子树置空
root.left=null;
//对下一个结点进行操作
root=root.right;
}
}
}
}
思路二
使用递归,自底向上思考。
class Solution {
//指向上一个结点
TreeNode pre=null;
public void flatten(TreeNode root) {
if(root==null) return;
//递归右子树
flatten(root.right);
//递归左子树
flatten(root.left);
//将右子树设为上一个结点
root.right=pre;
//更新pre
pre=root;
//左子树置空
root.left=null;
}
}