解法1:
分層遍歷二叉樹,判斷每一層的節點是否軸對稱。
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;
#define debug_
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {}
};
bool isok(vector<TreeNode*>& vec)
{
int i = 0, j = vec.size() - 1;
while (i < j)
{
if ((vec[i] == NULL&&vec[j] != NULL) || (vec[i] != NULL&&vec[j] == NULL))
{
return false;
}
if (vec[i]==NULL&&vec[j]==NULL)//考慮對稱的空節點
{
i++;
j--;
continue;
}
if (vec[i]->val != vec[j]->val)
{
return false;
}
i++;
j--;
}
return true;
}
bool isSymmetrical(TreeNode* pRoot)
{
if (pRoot == NULL)
{
return true;
}
vector<TreeNode*> vec_old;
vector<TreeNode*> vec_new;
vec_old.push_back(pRoot);
while (!vec_old.empty())
{
if (!isok(vec_old))
{
return false;
}
for (auto i = 0; i < vec_old.size(); ++i)
{
if (vec_old[i] == NULL)
{
continue;
}
vec_new.push_back(vec_old[i]->left);
vec_new.push_back(vec_old[i]->right);
}
swap(vec_old, vec_new);
vec_new.clear();
}
return true;
}
int p = 0;
TreeNode* DeSerialByPre(char* str)
{
if (str[p] == '#'){
p += 2;
return NULL;
}
TreeNode* node = new TreeNode(str[p]);
p += 2;
node->left = DeSerialByPre(str);
node->right = DeSerialByPre(str);
return node;
}
int main()
{
char* str = "8!6!5!#!#!7!#!#!6!7!#!#!5!#!#!";
TreeNode* root;
root = DeSerialByPre(str);
cout<<isSymmetrical(root);
#ifdef debug_
#else
#endif
return 0;
}
解法2:前序遍歷與對稱前序遍歷
bool isSymmetrical(TreeNode* pRoot1, TreeNode* pRoot2)
{
if (pRoot1 == NULL && pRoot2 == NULL)
{
return true;
}
if (pRoot1 == NULL || pRoot2 == NULL)
{
return false;
}
if (pRoot1->val != pRoot2->val)
{
return false;
}
return isSymmetrical(pRoot1->left, pRoot2->right) && isSymmetrical(pRoot1->right, pRoot2->left);
}
bool isSymmetrical(TreeNode* pRoot)
{
return isSymmetrical(pRoot, pRoot);
}