将一个二叉树用前序遍历的顺序展开成为一个全是右子树顺序的树。
因为主要是到当前节点的时候会使得前一个节点丢失,所以在遍历的时候要保存前一个节点,然后将此时的节点当作上个节点的右节点,左节点为null。因为之前保存了原来的右节点,所以不用担心丢失,等遍历完最后一个左子树的节点时自然就把右节点接到后面了。
class Solution {
public void flatten(TreeNode root) {
if(root==null)return;
Deque<TreeNode> dq=new LinkedList<TreeNode>();
dq.push(root);
TreeNode pre=null;
while(!dq.isEmpty()){
TreeNode temp=dq.pop();
if(pre!=null){
pre.right=temp;
pre.left=null;
}
if(temp.right!=null){
dq.push(temp.right);
}
if(temp.left!=null){
dq.push(temp.left);
}
pre=temp;
}
}
}
如果用递归的话更简单,因为如果递归的话就是先把左展开,再把右展开,然后将右拼接到左下面。
class Solution {
public void flatten(TreeNode root) {
if(root==null)return;
flatten(root.left);
flatten(root.right);
TreeNode right=root.right;
TreeNode left=root.left;
root.right=root.left;
root.left=null;
while(root.right!=null){
root=root.right;
}
root.right=right;
}
}