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

  

posted @ 2024-03-25 17:50  dmfsimle  阅读(1)  评论(0编辑  收藏  举报