LeetCode 101.&剑指 Offer 28. 对称的二叉树 | C++语言版

LeetCode101&剑指Offer28:对称二叉树解题策略
文章提供了三种方法解决对称二叉树问题:递归、队列和栈。每种方法都展示了C++的代码实现,通过比较二叉树的左右子树来判断是否对称。对于递归法,从根节点的左右子树开始比较;队列和栈则用于顺序处理节点,检查它们的内外侧对称性。

LeetCode 101. 对称二叉树

题目描述

题目地址101. 对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。
在这里插入图片描述
在这里插入图片描述

解题思路

思路一:使用递归
代码实现

C++

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool compare(TreeNode* left,TreeNode* right){
        //左节点为空,右节点不为空,不对称
        if(left==NULL && right!=NULL) return false;
        //左不为空,右为空,不对称
        else if(left!=NULL && right==NULL) return false;
        //左右都为空,对称,返回true
        else if(left==NULL && right==NULL) return true;
        //左右都不为空,比较节点数值,不相同,不对称
        else if(left->val!=right->val) return false;

        //左子树左右中,右子树右左中
        //比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子
        bool outside=compare(left->left,right->right);
        //比较内测是否对称,传入左节点的右孩子,右节点的左孩子
        bool inside=compare(left->right,right->left);
        //比较内侧和外侧节点都为true时才返回TRUE,其他情况都返回false
        bool isSame=outside && inside;
        return isSame;
    }
    bool isSymmetric(TreeNode* root) {
        //二叉树是否对称,要比较根节点的左子树与右子树是不是相互翻转的(即比较两个子树的里侧和外侧的元素是否相等)
        if(root==NULL) return true;
        return compare(root->left,root->right);
        
    }
};
运行结果

在这里插入图片描述

参考文章:

https://programmercarl.com/0101.%E5%AF%B9%E7%A7%B0%E4%BA%8C%E5%8F%89%E6%A0%91.html#%E9%80%92%E5%BD%92%E6%B3%95

思路二:使用队列
代码实现

C++

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        //二叉树是否对称,要比较根节点的左子树与右子树是不是相互翻转的(即比较两个子树的里侧和外侧的元素是否相等)
        //通过队列来判断根节点的左子树和右子树的内侧和外侧是否相等

        if(root==NULL) return true;
        queue<TreeNode*> que;
        // 将左子树头结点加入队列
        que.push(root->left);
        // 将右子树头结点加入队列
        que.push(root->right);
        
        //判断左右子树是否相互翻转
        while(!que.empty()){
            TreeNode* leftNode=que.front();que.pop();
            TreeNode* rightNode=que.front();que.pop();
            
            //左右节点都为空,对称,
            if(!leftNode && !rightNode){
                continue;
            }

            // 左右一个节点不为空,或者都不为空但数值不相同的情况,返回false
            if(!leftNode || !rightNode || (leftNode->val!=rightNode->val)){
                return false;
            }
            
            // 加入左节点左孩子
            que.push(leftNode->left);
            // 加入右节点右孩子
            que.push(rightNode->right);

            // 加入左节点右孩子
            que.push(leftNode->right);
            // 加入右节点左孩子
            que.push(rightNode->left);
        }
        return true;
    }
};
运行结果

在这里插入图片描述

参考文章:

https://programmercarl.com/0101.%E5%AF%B9%E7%A7%B0%E4%BA%8C%E5%8F%89%E6%A0%91.html#%E8%BF%AD%E4%BB%A3%E6%B3%95

思路三:使用栈
代码实现

C++

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        //二叉树是否对称,要比较根节点的左子树与右子树是不是相互翻转的(即比较两个子树的里侧和外侧的元素是否相等)
        //通过栈来判断根节点的左子树和右子树的内侧和外侧是否相等

        if(root==NULL) return true;
        stack<TreeNode*> st;
        // 将左子树头结点加入队列
        st.push(root->left);
        // 将右子树头结点加入队列
        st.push(root->right);
        
        //判断左右子树是否相互翻转
        while(!st.empty()){
            TreeNode* leftNode=st.top();st.pop();
            TreeNode* rightNode=st.top();st.pop();
            
            //左右节点都为空,对称,
            if(!leftNode && !rightNode){
                continue;
            }

            // 左右一个节点不为空,或者都不为空但数值不相同的情况,返回false
            if(!leftNode || !rightNode || (leftNode->val!=rightNode->val)){
                return false;
            }
            
            // 加入左节点左孩子
            st.push(leftNode->left);
            // 加入右节点右孩子
            st.push(rightNode->right);

            // 加入左节点右孩子
            st.push(leftNode->right);
            // 加入右节点左孩子
            st.push(rightNode->left);
        }
        return true;
    }
};
运行结果

在这里插入图片描述

参考文章:

https://programmercarl.com/0101.%E5%AF%B9%E7%A7%B0%E4%BA%8C%E5%8F%89%E6%A0%91.html#%E8%BF%AD%E4%BB%A3%E6%B3%95

LeetCode 剑指 Offer 28. 对称的二叉树

题目描述

题目地址剑指 Offer 28. 对称的二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/
2 2
/ \ /
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/
2 2
\
3 3
给你一个二叉树的根节点 root , 检查它是否轴对称。
在这里插入图片描述

解题思路

思路一:使用递归
代码实现

C++

/**
 * 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) {
        // 如果是空树
        if(!root)
            return true;
        else
            return isSymmetric(root->left, root->right);
    }
    // 此函数比较二叉树中位置对称的两个节点
    bool isSymmetric(TreeNode* left, TreeNode* right){
        // 结束条件1:如果对称两个节点都为空,则返回true
        if(!left && !right){
            return true;
        }
        // 结束条件2:如果单独一个节点为空,另一个节点不为空,又或者是对称节点间的val值不等,则返回false
        if(!left || !right || left->val != right->val)
            return false;
        // 该层符合对称二叉树的要求,开始比较下一层
        return isSymmetric(left->left, right->right) && isSymmetric(left->right, right->left);      

    }
};
运行结果

在这里插入图片描述

参考文章:

https://leetcode.cn/problems/dui-cheng-de-er-cha-shu-lcof/solutions/100148/cyu-pythonliang-chong-jie-fa-shi-xian-di-gui-yu-di/?orderBy=most_votes
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李莲花*

多谢多谢,来自一名大学生的感谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值