题目描述:
解题思路:
这道题和剑指Offer里面的二叉树的镜像是一模一样的题。我之前做过,居然没写出来。唉,太不认真了吧。
两种方法,递归和非递归。
递归有两种写法,不同的理解方式。
这道题的关键就再交换左右子树。
参考代码:
递归:
public TreeNode invertTree(TreeNode root) {
find(root);
return root;
}
void find(TreeNode root){
if(root==null)
return ;
//请先翻转我的两个子树
TreeNode temp=null;
temp=root.left;
root.left=root.right;
root.right=temp;
//虽然我的左右子树还没有翻转好,但是find函数会帮你们翻转的
find(root.left);
find(root.right);
}
public TreeNode invertTree2(TreeNode root) {
if(root==null)
return root;
TreeNode temp;
//inv函数,请先去找我的左右子树翻转
invertTree2(root.left);
invertTree2(root.right);
//翻转自己
temp=root.left;
root.left=root.right;
root.right=temp;
return root;
}
非递归:
public TreeNode invertTree(TreeNode root) {
Queue<TreeNode> queue=new LinkedList();
if(root==null)
return root;
queue.offer(root);
TreeNode temp,troot;
while (!queue.isEmpty())
{
int size=queue.size();
for (int i = 0; i < size; i++) {
troot=queue.poll();
temp=troot.left;
troot.left=troot.right;
troot.right=temp;
if(troot.left!=null) queue.offer(troot.left);
if(troot.right!=null) queue.offer(troot.right);
}
}
return root;
}