您的位置:首页 > 编程语言 > Java开发

Java实现二叉树镜像 变换

2017-06-02 14:51 369 查看


题目描述

操作给定的二叉树,将其变换为源二叉树的镜像。 
输入描述:
二叉树的镜像定义:源二叉树
8
/  \
6   10
/ \  / \
5  7 9 11
镜像二叉树
8
/  \
10   6
/ \  / \
11 9 7  5


我开始想的是递归,但是不对:

/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;

public TreeNode(int val) {
this.val = val;

}

}
*/
public class Solution {
public void Mirror(TreeNode root) {
if(root.right==null||root.left==null){
return;
}

int temp=root.left.val;
root.left.val=root.right.val;
root.right.val=temp;
Mirror(root.left);
Mirror(root.right);
}
}

给我的错误提示是:
答案错误:您提交的程序没有通过所有的测试用例
case通过率为0.00%

测试用例:
{8,6,10,5,7,9,11}

对应输出应该为:

{8,10,6,11,9,7,5}

你的输出为:

{8,10,6,7,5,11,9}

我大概知道为什么会出这个错误了,因为虽然我交换了每个节点的value值,但是没有同时修改该节点的后继。

这个题应该是,交换每个root下面的left节点和right节点,而不是只是把数值交换了。

所以我的第二版代码:

/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;

public TreeNode(int val) {
this.val = val;

}

}
*/
public class Solution {
public void Mirror(TreeNode root) {
if(root.right==null||root.left==null){
return;
}

TreeNode temp=root.left;
root.left=root.right;
root.right=temp;
Mirror(root.left);
Mirror(root.right);
}
}给我提示的错误是:
答案错误:您提交的程序没有通过所有的测试用例
case通过率为20.00%

测试用例:
{8,7,#,6,#,5,#,4}

对应输出应该为:

{8,#,7,#,6,#,5,#,4}

你的输出为:

{8,7,#,6,#,5,#,4}

这里就变得有趣了。这是一个斜树,如果用if(root.right==null||root.left==null)会导致我的树根本无法交换,但是,如果用&& ,这里会报nullpoint的错误。

想一想,遇到了 null 的节点,节点本身是要交换的,但是应该给予判断,这个null节点不需要再递归Mirror了。

【还要考虑root为null的情况!!!】

AC代码: 33 ms, 692K 

/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;

public TreeNode(int val) {
this.val = val;

}

}
*/
public class Solution {
public void Mirror(TreeNode root) {
if(root==null){return;}

if(root.right==null&&root.left==null){
return;
}

TreeNode temp=root.left;
root.left=root.right;
root.right=temp;
if(root.left!=null){
Mirror(root.left);}
if(root.right!=null){
Mirror(root.right);}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: