#include<iostream>
#include<vector>
#include<queue>
using namespace std;
//二叉树节点的定义
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x):val(x),left(nullptr),right(nullptr){}
};
////辅助函数,判断以left和right为根节点的两课树是否轴对称
//bool isSymmetricHelper(TreeNode* left, TreeNode* right) {
// //如果两个节点都为空,则对称
// if (!left && !right) {
// return true;
// }
// //如果只有一个节点为空,或者两个节点的值不相等,则不对称
// if (!left || !right || left->val != right->val)return false;
//
// //递归判断左节点的左子树和右节点的右子树,以及左节点的右子树和右节点的左子树是否对称
// return isSymmetricHelper(left->left,right->right) && isSymmetricHelper(left->right,right->left);
//}
////主函数,检查二叉树是否轴对称
//bool isSymmetric(TreeNode* root) {
// if (!root)return true;
// return isSymmetricHelper(root->left,root->right);
//}
//
////创建二叉树
//TreeNode* createTree(vector<int>& nodes, int index) {
// if (index >= nodes.size() || nodes[index] == -1) {
// return nullptr;//如果节点为空,则返回nullptr
// }
// TreeNode* root = new TreeNode(nodes[index]);//创建当前节点
// root->left = createTree(nodes, 2 * index + 1);//创建左子树
// root->right = createTree(nodes, 2 * index + 2);//创建右子树
// return root;//返回当前节点
//}
//非递归
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if (!root)return true;//空树是对称的
queue<TreeNode*> q;//辅助队列,用于层级遍历
q.push(root->left);
q.push(root->right);
while (!q.empty())
{
TreeNode* leftNode = q.front();//当前层级对称的左节点
q.pop();
TreeNode* rightNode = q.front();//当前层级对称的右节点
q.pop();
if (!leftNode && !rightNode) {
continue;//左右节点都为空,继续下一次循环
}
if (!leftNode || !rightNode || leftNode->val != rightNode->val) {
return false;//左右节点有一个为空,或者值不相等,返回false
}
//将左节点的左子节点与右节点的右子节点,左节点的右子节点与右节点的左子节点的左子节点依次入队
q.push(leftNode->left);
q.push(rightNode->right);
q.push(leftNode->right);
q.push(rightNode->left);
}
return true;//遍历完所有对称节点,返回true
}
};
//创建二叉树
TreeNode* createTree(vector<int>& nodes,int index) {
if (index >= nodes.size() || nodes[index] == -1) {
return nullptr;//如果节点为空,则返回nullptr
}
TreeNode* root = new TreeNode(nodes[index]);
root->left = createTree(nodes,2*index+1);
root->right = createTree(nodes,2*index+2);
return root;
}
int main() {
//输入二叉树的先序遍历序列,-1表示空节点
//vector<int> nodes = { 1,2,2,3,4,4,3 };
//TreeNode* root = createTree(nodes, 0);
//cout << (isSymmetric(root) ? "true" : "false") << endl;
//方法二
vector<int> nodes = { 1,2,2,3,4,4,3 };//对称的二叉树的层序遍历序列
TreeNode* root = createTree(nodes,0);//创建二叉树
Solution soluction;
bool result = soluction.isSymmetric(root);//判断二叉树是否对称
cout << (result ? "true" : "false") << endl;
system("pause");
return 0;
}