41 对称二叉树

本文介绍了如何判断一个二叉树是否对称。通过递归思路解决,对比每个节点与其镜像位置的节点,如果都不存在、一个存在一个不存在或者元素值不相等则返回不对称。
摘要由CSDN通过智能技术生成

41 对称二叉树

作者: Turbo时间限制: 1S章节: DS:树
晚于: 2020-08-05 12:00:00后提交分数乘系数50%
截止日期: 2020-08-12 12:00:00

问题描述

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

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

1

/ \

2 2

/ \ / \

3 4 4 3
二叉树[1,2,2,null,3,3,null,5,-2,-2,5]是对称的。

                    1

                /        \

              2           2

               \         /

                3      3

              /  \    /  \

            5  -2  -2  5

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

1

/ \

2 2

\ \

3 3

代码框架

#include <iostream>

#include <queue>

#include <cstdlib>

#include <cstring>

using namespace std;

struct TreeNode

{

    int val;

    TreeNode *left;

    TreeNode *right;

    TreeNode() : val(0), left(NULL), right(NULL) {}

    TreeNode(int x) : val(x), left(NULL), right(NULL) {}

    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}

};

TreeNode* inputTree()

{

    int n,count=0;

    char item[100];

    cin>>n;

    if (n==0)

        return NULL;

    cin>>item;

    TreeNode* root = new TreeNode(atoi(item));

    count++;

    queue<TreeNode*> nodeQueue;

    nodeQueue.push(root);

    while (count<n)

    {

        TreeNode* node = nodeQueue.front();

        nodeQueue.pop();

        cin>>item;

        count++;

        if (strcmp(item,"null")!=0)

        {

            int leftNumber = atoi(item);

            node->left = new TreeNode(leftNumber);

            nodeQueue.push(node->left);

        }

        if (count==n)

            break;

        cin>>item;

        count++;

        if (strcmp(item,"null")!=0)

        {

            int rightNumber = atoi(item);

            node->right = new TreeNode(rightNumber);

            nodeQueue.push(node->right);

        }

    }

    return root;

}



int main()

{

TreeNode* root;

root=inputTree();

bool res=Solution().isSymmetric(root);

cout<<(res?"true":"false");

}

输入说明

首先输入结点的数目n(注意,这里的结点包括题中的null空结点)然后输入n个结点的数据,需要填充为空的结点,输入null。

输出说明

输出true或false

输入范例

11
1 2 2 null 3 3 null 5 -2 -2 5

输出范例

true

解题思路

用递归的思想来解决问题,对于该二叉树中的节点来说,如果对应位置的两个节点都不存在,则是对称的;如果对应位置的两个节点一个存在一个不存在,或者是节点的元素值不相等的话,是不对称的。(以上为递归结束的边界条件)

详细实现

class Solution
{
    bool check(TreeNode* p, TreeNode* q)
    {
        if (!p && !q)
            return true;
        if (!p || !q || p->val != q->val)
            return false;
        return check(p->left, q->right) && check(p->right, q->left);
    }
public:
    bool isSymmetric(TreeNode* root)
    {
        if (!root)
            return true;
        return check(root->left, root->right);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对称二叉树是一种特殊的二叉树,它的左子和右子镜像对称。下面是一份使用 C++ 实现对称二叉树判断的代码: ```c++ #include<iostream> using namespace std; struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; bool isSymmetric(TreeNode* root) { if (!root) return true; return isSymmetric(root->left, root->right); } bool isSymmetric(TreeNode* left, TreeNode* right) { if (!left && !right) return true; if (!left || !right) return false; if (left->val != right->val) return false; return isSymmetric(left->left, right->right) && isSymmetric(left->right, right->left); } 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); bool res = isSymmetric(root); if (res) cout << "This is a symmetric binary tree." << endl; else cout << "This is not a symmetric binary tree." << endl; return 0; } ``` 在上面的代码中,我们使用了递归的方法来实现对称二叉树的判断。如果一个二叉树对称二叉树,那么它的左子和右子一定是镜像对称的。因此,我们可以递归地比较左子的左子和右子的右子,以及左子的右子和右子的左子是否相等。如果相等,则说明这个二叉树对称二叉树
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值