剑指Offer之对称二叉树

题目描述

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。例如图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);
    }
}

坚持写,多思考,总会提高! 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值