题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。例如图4.3中,第一二棵树是对称的,第三棵不是对称的。
解题思路:1、可以构造出这个树的镜像,然后遍历这个树的镜像和这原来这颗树,如果是一样的话,说明是对称二叉树。
2、使用第二种方案:通过观察可知道,如果二叉树对称,则根左右遍历的结果和根右左遍历的结果是一样的,可以画一下图试试。其次,如果出现了遍历序列的值全部是一样的(如上图中的第三棵树)怎么判断是不是对称的树呢?把节点的左右孩子没有值设置为null,加入到遍历序列中就解决了。
第二种方案的代码如下:
public class 对称二叉树 {
public static boolean isSymmetrical(TreeNode pRoot)
{
String s1 = getlr(pRoot).toString();
String s2 = getrl(pRoot).toString();
System.out.println(s1);
System.out.println(s2);
return s1.equals(s2);
}
/**根左右遍历pRoot,当节点没有左右孩子,则使用null代替,排除数字全是一样的情况*/
public static StringBuffer getlr(TreeNode root){
StringBuffer buffer = new StringBuffer();
return myscan(root,"lr",buffer);
}
/**根右左遍历pRoot*/
public static StringBuffer getrl(TreeNode root){
StringBuffer buffer = new StringBuffer();
return myscan(root,"rl",buffer);
}
public static StringBuffer myscan(TreeNode treeNode,String param,StringBuffer buffer){
if (treeNode!=null){
buffer.append(treeNode.val);
//根左右遍历
if ("lr".equals(param)){
myscan(treeNode.left,param,buffer);
//这个地方有问题,当buffer中已经有了很多数据,已经把buffer传进去了,递归调用里面添加了数据,返回回来,又给buffer中重复添加了一遍。
//因此不能这样写buffer.append(myscan(treeNode.right,param,buffer));
myscan(treeNode.right,param,buffer);
}
//根右左遍历
if ("rl".equals(param)){
myscan(treeNode.right,param,buffer);
myscan(treeNode.left,param,buffer);
}
}else {
buffer.append("null");
}
return buffer;
}
public static void main(String [] args){
TreeNode treeNode1_1 = new TreeNode(8);
TreeNode treeNode1_2 = new TreeNode(6);
TreeNode treeNode1_3 = new TreeNode(6);
TreeNode treeNode1_4 = new TreeNode(5);
TreeNode treeNode1_5 = new TreeNode(7);
TreeNode treeNode1_6 = new TreeNode(7);
TreeNode treeNode1_7 = new TreeNode(5);
treeNode1_1.left = treeNode1_2;
treeNode1_1.right = treeNode1_3;
treeNode1_2.left = treeNode1_4;
treeNode1_2.right = treeNode1_5;
treeNode1_3.left = treeNode1_6;
treeNode1_3.right = treeNode1_7;
isSymmetrical(treeNode1_1);
}
}
坚持写,多思考,总会提高!