二叉树的实现(c++)
#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; }