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);
}
};