对称的二叉树

这篇博客介绍了如何判断一棵二叉树是否对称,提供了两种解题方法:递归和迭代。递归解法通过比较左右子树的对应节点值及递归其左右子树来实现;迭代解法则使用队列,先将根节点入队两次,然后依次比较出队的节点。两种方法均能有效检测二叉树的对称性。
摘要由CSDN通过智能技术生成

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

链接:https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof/

1.递归

思路:递归的思路很容易想

  1. 两节点不同时为空时,则不是对称的
  2. 两节点同时为空,则是对称的
  3. 两节点值不相等时,则不是对称的
  4. 递归传递的条件,必须是一棵树的左边另一颗树的右边。和一颗树的右边和另一颗树的左边。
  5. 这样的树的比较最后,才是对称的。

代码:

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root == nullptr)
            return true;
        return _isSymmetric(root->left, root->right);
    }
private:
    bool _isSymmetric(TreeNode* _left, TreeNode* _right)
    {
        if(_left == _right)//同时为空
            return true;
        else if(_left == nullptr || _right == nullptr)//不同时为空
            return false;
        else if(_left->val != _right->val)//值不相等
            return false;
        //递归条件,左边的左树和右边的右树,左边的右树和右边的左树
        return _isSymmetric(_left->left, _right->right) && _isSymmetric(_left->right, _right->left);
    }
};

2. 迭代

迭代的时候,借助一个队列

  1. 最开始将头节点入队两次;
  2. 每一次比较两个节点之间值是否相等;
  3. 两边是否同时为空,同时为空时,则不做判断,跳出本次循环;
  4. 若不同为空,则肯定不是对称二叉树;
  5. 队列元素入队时,考虑顺序入队;
  6. 左边的左树和右边的右树;
  7. 左边的右树和右边的左树;
  8. 这样出队比较的就是对称的树。

代码

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root == nullptr)
            return true;
        queue<TreeNode*> _que;
        _que.push(root);//根节点入队两次
        _que.push(root);
        while(!_que.empty())
        {
            TreeNode* _left = _que.front();//左边
            _que.pop();
            TreeNode* _right = _que.front();//右边
            _que.pop();
            if(_left == nullptr && _right == nullptr)//同时为空,跳出本次循环
                continue;
            else if(_left == nullptr || _right == nullptr)//不同时为空,返回false
                return false;
            else if(_left->val != _right->val)//值不相等,返回false
                return false;
            _que.push(_left->left);//入队顺序,左边的左树和右边的右树;
            _que.push(_right->right);
            _que.push(_left->right);//入队顺序,左边的右树和右边的左树;
            _que.push(_right->left);
        }
        return true;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值