牛客网:对称的二叉树

54 篇文章 0 订阅

目录

1.递归

2.队列


1.递归

用递归来解决是一个很好的方法,首先如何判断一棵树是否是对称的呢,对于一个根来说,如果他的左右子树相互对称,或者都没有,那么他就是对称的。

代码上实现我们把一棵树当成两颗,一个往左走去和另一个往右走的比较,相反也是一样。

对比两个节点有下面几种情况:

1.都为空,说明对称

2.其中一个为空或者值不相等,不对称

3.一个节点往左走和另一个往右走看是否对称,相反也是一样

代码如下所示:

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    bool Symmetrical(TreeNode* r1, TreeNode* r2){
        if(r1==NULL&&r2==NULL){
            return true;
        }
        if(r1==NULL||r2==NULL||r1->val!=r2->val){
            return false;
        }
        return Symmetrical(r1->left, r2->right) && Symmetrical(r1->right, r2->left);
    }
    bool isSymmetrical(TreeNode* pRoot) {
        return Symmetrical(pRoot, pRoot);
    }

};

2.队列

这里用一个队列模拟之前的递归操作。

我们可以这么想,如果是对称的,那么树的每一层都是对称的回文结构,那么我们在二叉树里面按照层序遍历的思路来按照相反的方向去遍历,如果出来的值是相等或都为空,那么就是对称的,如果存在值不相等,或一个是空节点,那么就不对称。

代码如下所示:

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    bool isSymmetrical(TreeNode* pRoot) {
        if(pRoot==NULL){
            return true;
        }
        queue<TreeNode*>q1;
        queue<TreeNode*>q2;
        q1.push(pRoot);
        q2.push(pRoot);
        while(!q1.empty() && !q2.empty()){
            TreeNode *left=q1.front();
            q1.pop();
            TreeNode *right=q2.front();
            q2.pop();
            if(left==NULL && right==NULL){
                continue;
            }
            if(left==NULL || right==NULL || left->val!=right->val){
                return false;
            }
            q1.push(left->left);
            q1.push(left->right);
            q2.push(right->right);
            q2.push(right->left);
        }
        return true;
    }

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值