对称二叉树 【leetcode - 101 - 简单】

 

    胡扯:这个题,感觉挺好的。 这里给出两种思路,第二种思路是参考别人的思路写出来的,但是,里面的递归让我弄了很久,也让我对递归更加清楚了一些。事情慢慢变得有趣了 ... 

思路一:

    1、这个是我最先开始想到的思路代码也还好。

    2、除去根节点,左右开始遍历。

    3、左边按照  左根右 的顺序来遍历,右边按照 右根左 的顺序来遍历。叶子节点没有节点。其它节点如果只有一个子节点,另外一个用 * 来代替,如果不这样会有问题,可以思考一下。

    4、这样存储起来的两个字符串,对比如果相等。那么就是对称二叉树了。

代码一:

class Solution {
    
    
    String left = "";
    String right = "";
    void leftDfs(TreeNode root){

        if (root == null)
            return;
        left += root.val + "";
        if(root.left != null)
            leftDfs(root.left);
        else if(root.right != null)
            left += "*";
        if(root.right != null)
            leftDfs(root.right);
        else if(root.left != null)
            left += "*";
    }
    void RightDfs(TreeNode root){

        if (root == null)
            return;
        right += root.val + "";
        if(root.right != null)
            RightDfs(root.right);
        else if(root.left != null)
            right += "*";
        if(root.left != null)
            RightDfs(root.left);
        else if(root.right != null)
            right += "*";
    }

    public boolean isSymmetric(TreeNode root) {

        if (root == null ||  (root.right == null && root.left == null) )
            return true;

        leftDfs(root.left);
        RightDfs(root.right);

//        System.out.println(left);
//        System.out.println(right);
        return left.equals(right);
    }
}

 

思路二:

    1、这个思路是我提交成功后,看评论得出的思路。  【同时比较节点】

    2、节点的遍历顺序也是, 左边   左根右, 右边  右根左。

    3、如果相对位置不相同,那么就不是对称了。

    4、这里困扰我最大的一个问题就是,除了相同位置 值,不一样不是对称,还有一种情况就是高低不一样的问题。其实这个如果想明白了就是很简单,没想明白就比较难了。

    5、代码也比较简单,建议可以先按照这个思路写一遍。

 

代码二:

class Solution {
    
    boolean flag = true;
    void dfs(TreeNode l,TreeNode r){

        if (l.val != r.val){
            flag = false;
            return;
        }
        if (  l.left == null && l.right == null && r.left == null && r.right == null )
            return;
        if (l.left != null && r.right != null)
            dfs(l.left,r.right);
        else if (l.left != null || r.right != null)
            flag = false;
        if (l.right != null && r.left != null)
            dfs(l.right,r.left);
        else if (l.right != null || r.left != null)
            flag = false;

    }
    public boolean isSymmetric(TreeNode root) {

        if (root == null)
            return true;
        dfs(root,root);
        return flag;
    }
}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值