打卡第二十天:对称二叉树


一、题目


在这里插入图片描述


二、代码实现


方法一:递归

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSymmetric(TreeNode root) {
        return isMirror(root,root);
        //左子树与右子树镜像对称
    }

    public boolean isMirror(TreeNode t1,TreeNode t2){
        if(t1 == null && t2 == null) return true;
        if(t1 == null || t2 == null) return false;
        return (t1.val == t2.val) && isMirror(t1.left,t2.right) && isMirror(t1.right,t2.left);
        //每一棵树的左子树都与另一棵树的右子树镜像对称并且它们的根节点具有相同的值
    }
}

执行结果:
在这里插入图片描述
时间复杂度:O(n)
空间复杂度:O(n)

方法二:迭代

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSymmetric(TreeNode root) {
    Queue<TreeNode> q = new LinkedList<>();
    q.add(root);
    q.add(root);
    while (!q.isEmpty()) {
        TreeNode t1 = q.poll();
        TreeNode t2 = q.poll();
        if (t1 == null && t2 == null) continue;
        if (t1 == null || t2 == null) return false;
        if (t1.val != t2.val) return false;
        q.add(t1.left);
        q.add(t2.right);
        q.add(t1.right);
        q.add(t2.left);
    }
    return true;
    }
}

执行结果:
在这里插入图片描述
时间复杂度:O(n)
空间复杂度:O(n)


三、收获


方法一(递归)的解题思路是:
如果一个树的左子树与右子树镜像对称,那么这个树是对称的,从而将问题转化为:
两个树在什么情况下互为镜像
对此问题进行思考,发现如果同时满足以下两个条件,两树互为镜像:
(1)它们的两个根节点具有相同的值
(2)每一棵树的右子树都与另一棵树的左子树镜像对称
于是,我们得到方法一的代码

方法二(迭代)的解题思路是:
队列中每两个连续的结点应该是相等的,而且它们的的子树互为镜像
最初,队列中包含的是root和root
该算法的工作原理类似于BFS(Breadth First Search),但是存在一些关键差异
每次提取两个结点并比较它们的值,然后将两个结点的左右子结点按相反的的顺序插入队列中
当队列为空时,或者是检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值