面试题28-对称的二叉树

题目

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
在这里插入图片描述

解题思路

我们定义一种对称的遍历算法,即先遍历父节点,再遍历它的右子节点,最后遍历它的左子节点。
通过比较二叉树的前序遍历序列和对称前序遍历序列来判断二叉树是不是对称的。如果两个序列是一样的,那么二叉树就是对称的。

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        return isSymmetric(root,root);
    }
    //注:root=nullptr可以转化为!root
    bool isSymmetric(TreeNode* root1,TreeNode* root2) {
        if(!root1&&!root2)// root=nullptr为false(转化为boll类型),!root=true
            return true;
        if(!root1||!root2)
            return false;
        if(root1->val!=root2->val)
            return false;
        return isSymmetric(root1->left,root2->right)&&isSymmetric(root1->right,root2->left);
    }
};
  1. 时间复杂度:O(n),其中 N 为二叉树的节点数量,每次执行 isSymmetric() 可以判断一对节点是否对称,因此最多调用 N/2 次 isSymmetric() 方法。leetcode上说明这里遍历了整棵树,遍历和调用isSymmetric的区别是?
  2. 空间复杂度 O(N) : 最差情况下(见下图),二叉树退化为链表,系统使用 O(N) 大小的栈空间
    在这里插入图片描述
    注:此方式会遍历两次,存在重复遍历,可修改为
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        return isSymmetric(root_>left,root->right);
    }
    //注:root=nullptr可以转化为!root
    bool isSymmetric(TreeNode* root1,TreeNode* root2) {
        if(!root1&&!root2)// root=nullptr为false(转化为boll类型),!root=true
            return true;
        if(!root1||!root2)
            return false;
        if(root1->val!=root2->val)
            return false;
        return isSymmetric(root1->left,root2->right)&&isSymmetric(root1->right,root2->left);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值