剑指offer(C++)-JZ28:对称的二叉树(数据结构-树)

简介: 剑指offer(C++)-JZ28:对称的二叉树(数据结构-树)

题目描述:

给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)

例如:                                 下面这棵二叉树是对称的

下面这棵二叉树不对称。

数据范围:节点数满足0≤n≤1000,节点上的值满足∣val∣≤1000

要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

备注:

你可以用递归和迭代两种方法解决这个问题

示例:

输入:

{1,2,2,3,4,4,3}


返回值:

true


解题思路:

本题考察数据结构树的使用。当根节点为空时,对称;比较左子树和右子树,若左子树存在右子树不存在,则不对称;若左子树不存在右子树存在,则不对称;若左右子树均不存在,则对称;若左子树根值不等于右子树根植,则不对称;递归,继续将左子树的左子树和右子树的右子树比较,将左子树的右子树和右子树的左子树比较。完毕。

测试代码:

/*
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)
            return true;
        // 根节点的左右子树进行比较
        return Compare(pRoot->left,pRoot->right);
    }
    // 比较函数
    bool Compare(TreeNode* left,TreeNode* right){
        // 若左子树存在右子树不存在,则不对称;若左子树不存在右子树存在,则不对称
        if((!left&&right)||(left&&!right))
            return false;
        // 若左右子树均不存在,则对称
        if(!left&&!right)
            return true;
        // 若左子树根值不等于右子树根植,则不对称
        if(left->val!=right->val)
            return false;
        // 递归:将左子树的左子树和右子树的右子树比较,将左子树的右子树和右子树的左子树比较
        return Compare(left->left,right->right)&&Compare(left->right,right->left);
    }
};


相关文章
|
9天前
|
存储 C++ 索引
c++数据结构
c++数据结构
19 3
|
11天前
|
Java
JAVA数据结构刷题 -- 二叉树进阶
JAVA数据结构刷题 -- 二叉树进阶
19 0
|
11天前
|
存储 Java
JAVA数据结构刷题 -- 力扣二叉树
JAVA数据结构刷题 -- 力扣二叉树
18 0
|
12天前
|
存储
数据结构(树)
数据结构(树)
22 1
TU^
|
12天前
|
存储 机器学习/深度学习 算法
数据结构~~二叉树-堆
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
TU^
21 1
|
13天前
|
索引
[数据结构]——二叉树链式结构的实现
[数据结构]——二叉树链式结构的实现
|
13天前
|
算法
[数据结构]——二叉树——堆排序
[数据结构]——二叉树——堆排序
|
13天前
|
存储 算法 索引
[数据结构]——二叉树——堆的实现
[数据结构]——二叉树——堆的实现
|
13天前
|
存储 算法
[数据结构]—二叉树基本概念
[数据结构]—二叉树基本概念
|
13天前
|
存储 算法
数据结构实验(四)二叉树的基本操作
数据结构实验(四)二叉树的基本操作