Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree is symmetric:
1 / \ 2 2 / \ / \ 3 4 4 3
But the following is not:
1 / \ 2 2 \ \ 3 3
Note:
Bonus points if you could solve it both recursively and iteratively.
题目解析:
代码分成两个部分
1、根据类似于char treeNodes[] = {2,3,3,4,5,5,4,'#','#',8,9,'#','#',9,8};构建树
2、判断两个树是否为对称树。
主要的思想:
递归判断两个树的子树是不是对称的。
一开始的误区,想通过提取每一层的数字,然后判断是不是回文的,但是这种方法丢失了树的结构信息。
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
bool isSymmetricTwoSubtree(TreeNode *leftSubtree,TreeNode *rightSubtree)
{
if(leftSubtree == NULL && rightSubtree !=NULL)
return false;
if(leftSubtree != NULL && rightSubtree ==NULL)
return false;
if(leftSubtree !=NULL && rightSubtree!=NULL)
{
if(leftSubtree->val != rightSubtree->val)
return false;
if(leftSubtree->left == NULL &&leftSubtree->right == NULL && rightSubtree->left == NULL && rightSubtree->right == NULL)
{
if(leftSubtree->val == rightSubtree->val)
return true;
}
return isSymmetricTwoSubtree(leftSubtree->left,rightSubtree->right) && isSymmetricTwoSubtree(leftSubtree->right,rightSubtree->left);
}
}
bool isSymmetric(TreeNode *root) {
if(root == NULL)
return true;
return isSymmetricTwoSubtree(root->left,root->right);
}
char treeNodes[] = {2,3,3,4,5,5,4,'#','#',8,9,'#','#',9,8};
//char treeNodes[] = {2,3,3,4,5,5,4};
TreeNode *constructIterative(char *treeNodes,int len,int pos)
{
if(pos >= len || treeNodes[pos] == '#')
return NULL;
TreeNode *tn = (TreeNode *)malloc(sizeof(TreeNode));
tn->val = treeNodes[pos];
tn->left = constructIterative(treeNodes,len,2*pos+1);
tn->right = constructIterative(treeNodes,len,2*pos+2);
return tn;
}
int main(void)
{
TreeNode *root;
root = constructIterative(treeNodes,sizeof(treeNodes)/sizeof(char),0);
cout << isSymmetric(root) << endl;
system("pause");
return 0;
}