题目描述
给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
将其展开为
思路
以根节点为基准,先处理左子树,然后处理右子树,当其左右子树均转化为链表之后,
再处理以该根节点所代表的树,将其右子树赋给临时变量,设root.right=root.left,并将左子树置空,然后将临时变量赋给root.right。
public void flatten(TreeNode root) {
if(root==null)
return;
if(root.left==null&&root.right==null) {//叶子结点
return;
}
if(root.left!=null&&root.right!=null) {
flatten(root.left);
flatten(root.right);
TreeNode tmp=root.right;
root.right=root.left;
TreeNode p=root.right;
while(p.right!=null) {
p=p.right;
}
p.right=tmp;
root.left=null;
}
if(root.left!=null&&root.right==null) {
root.right=root.left;
root.left=null;
}
if(root.left==null&&root.right!=null) {
flatten(root.right);
return;
}
}