题目描述:
给定一个二叉树,原地将它展开为链表。
样例:
给定一棵二叉树如下:
将其展开为:
分析:
如果节点为空或者节点的左右孩子节点均为空则直接返回
若左右孩子节点均存在,则分别对节点的左右子树操作。首先将其左子树转换成链表,然后将其右子树转换成链表;将该节点的右子树保存到副本中,将左子树赋给右指针,遍历当前结点右孩子节点的右子树,直到为空,将最后一个节点的右指针指向原来保存的副本节点,即当前根节点原来的右孩子节点。
如果根节点的右孩子节点为空左孩子节点不空,则直接将右指针指向左孩子节点,将左指针置为空,然后对右子树变换;
如果根节点的左孩子节点为空右孩子节点不空,则直接对右孩子节点转换即可。
//执行用时 : 2 ms, 在Flatten Binary Tree to Linked List的Java提交中击败了97.06% 的用户
//内存消耗 : 34.8 MB, 在Flatten Binary Tree to Linked List的Java提交中击败了91.79% 的用户
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;
root.left=null;
TreeNode p=root.right;
while(p.right!=null)
p=p.right;
p.right=tmp;
return;
}
if(root.left==null&&root.right!=null) {
flatten(root.right);
return;
}
if(root.left!=null&&root.right==null) {
root.right=root.left;
root.left=null;
flatten(root.right);
return;
}
}