c++算法数据结构学习-对称二叉树

一.题目描述

给你一个二叉树的根节点 root , 检查它是否轴对称。

输入:root = [1,2,2,3,4,4,3]
输出:true

二.思路

首先想清楚,判断对称二叉树要比较的是哪两个节点,要比较的可不是左右节点!比较的是两个子树的里侧和外侧的元素是否相等。如图所示:

 该题需要同时遍历两棵树,从外到内的遍历可以采用后序遍历方法,及左树顺序为左右中,右树为右左中。

对于二叉树后序遍历可以采用递归法和迭代法解决。

三.代码

//递归法
class Solution {
public:
    bool compare(TreeNode* left, TreeNode* right) 
    {
        //对两个节点进行判断
        if(left==nullptr&&right!=nullptr) return false;
        else if (left != nullptr && right == nullptr) return false;
        else if (left==nullptr &&right==nullptr) return true;
        else if(left->val !=right->val) return false;
        //节点值相同情况,做下一层判断
        //从外到内的顺序
        bool outside=compare(left->left,right->right);
        bool inside=compare(left->right,right->left);
        bool isSame = outside && inside;  
        return isSame;
    }
    bool isSymmetric(TreeNode* root) {
        if (root == NULL) return true;
        return compare(root->left, root->right);
    }
};

//迭代法
bool isSymmetric(TreeNode* root) {
        if(root==nullptr) return true;
        stack<TreeNode*>st;
        st.push(root->left);
        st.push(root->right);
        while(!st.empty())
        {
            TreeNode*left=st.top();
            st.pop();
            TreeNode*right=st.top();
            st.pop();
            if(!left&&!right)//左右同时为空,对称,跳过该次循环,不向下遍历
                continue;
            if(!left || !right ||(left->val!=right->val))
                return false;
            st.push(left->left);
            st.push(right->right);
            st.push(left->right);
            st.push(right->left);
        }
        return true;

    }

### 关于对称二叉树的概念 对称二叉树是指一棵二叉树与其镜像完全相同。换句话说,如果将这棵二叉树沿着中心线翻转,则其形状保持不变[^1]。 ### 判断对称二叉树的逻辑 判断一颗二叉树是否是对称的核心在于比较左子树和右子树是否互为镜像。具体来说: - 如果根节点为空,则该树是对称的。 - 对于非空根节点,需递归地验证左子树和右子树是否满足以下条件: - 左子树的左孩子等于右子树的右孩子; - 左子树的右孩子等于右子树的左孩子; 上述过程可以通过递归函数来实现。 ### 使用C++实现对称二叉树的代码示例 以下是基于C++的一个简单实现方法,用于检测给定的二叉树是否是对称的: ```cpp #include <iostream> using namespace std; // 定义二叉树结点结构体 struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; // 辅助函数:判断两棵树是否互为镜像 bool isMirror(TreeNode* t1, TreeNode* t2) { if (t1 == NULL && t2 == NULL) return true; // 都为空则相等 if (t1 == NULL || t2 == NULL) return false; // 只有一个为空则不相等 return (t1->val == t2->val) && isMirror(t1->left, t2->right) && isMirror(t1->right, t2->left); // 比较对应位置的孩子节点 } // 主函数:判断整棵树是否对称 bool isSymmetric(TreeNode* root) { return isMirror(root, root); } int main() { // 构建测试用的二叉树 TreeNode* root = new TreeNode(1); root->left = new TreeNode(2); root->right = new TreeNode(2); root->left->left = new TreeNode(3); root->left->right = new TreeNode(4); root->right->left = new TreeNode(4); root->right->right = new TreeNode(3); cout << (isSymmetric(root) ? "True" : "False") << endl; // 输出 True 表示对称 return 0; } ``` 此程序定义了一个`TreeNode`类表示二叉树中的每一个节点,并通过辅助函数 `isMirror()` 来递归检查两个子树是否互为镜像。最终调用 `isSymmetric()` 函数完成整个树的对称性判定。 ### 结论 以上展示了如何利用C++编写一个简单的算法来检验二叉树是否具有对称性质。这种方法的时间复杂度为O(n),其中n代表树中节点的数量,因为每个节点最多被访问一次。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值