101. 对称二叉树

这篇博客讨论了如何判断一个二叉树是否对称,提供了两种方法:一种是递归,另一种是使用队列进行迭代。递归方法通过比较每个节点的左右子节点是否对称来判断;迭代方法则是通过队列,每次取出连续的两个节点进行比较,直到队列为空。这两种方法都考虑了空节点的情况,并确保了在比较过程中节点的对称性。
摘要由CSDN通过智能技术生成

101. 对称二叉树

给定一个二叉树,检查它是否是镜像对称的。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        bool res = true;
        if(!root)
        return res;
        res = dfs(root->left,root->right);
        return res;
    }
    bool dfs(TreeNode* left,TreeNode* right){
        if(!left && !right) return true;
        if(!left || !right) return false;
        if(left->val != right->val) return false;
        return dfs(left->left,right->right) && dfs(left->right,right->left);
    }
};

解答:如果要判断这棵树是否对称,那么他的子树肯定也是对称的,所以要用到递归。我们要判断的并不是一个节点的左右子节点是否是相同的而是这棵树是否是对称的。所以要把递归的形参改为对称的节点。这个对称节点的左子节点应该与另一个对称节点的右子节点对称,这个对称节点的右子节点应该与另一个对称节点的左子节点对称。那么返回值就可以确定了。又节点存在为空的情况,如果两个需要判断的节点同时为空可以判为true,如果一个为空一个不为空,则为false,如果都不为空则判断val是否相等。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        return check(root);
    }
    bool check(TreeNode* root){
        queue<TreeNode*> q;
        q.push(root);
        q.push(root);
        while(!q.empty()){
            TreeNode* left = q.front();
            q.pop();
            TreeNode* right = q.front();
            q.pop();
            if(!left && !right) continue;
            if(!left || !right) return false;
            if(left->val != right->val) return false;
            q.push(left->left);
            q.push(right->right);
            q.push(left->right);
            q.push(right->left);
        }
        return true;
    }
};

解答:在递归的基础上写出迭代写法,由于根节点有且只有一个所以他可以认为和自己对称,然后还是上面的方法,但是需要注意的是,需要比较的是从队列出来的连续两个元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值