c++实现二叉排序树的基本操作

本文介绍了如何使用C++实现二叉排序树的基本操作,包括插入、高度计算、完全二叉树判断,以及从括号表示法构建和输出二叉树。此外,还讲解了如何将二叉排序树转换为双向链表和二叉树的宽度计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树结构体

typedef struct TreeNode {
	char val;
	TreeNode* left;
	TreeNode* right;
	TreeNode() :val(NULL), left(NULL), right(NULL) {};
	TreeNode(char x) :val(x), left(NULL), right(NULL) {};
}*BiTree;

二叉排序树的插入
也可通过插入建立二叉排序树

void insert_Tree(BiTree &T, char s) {
	if (T == NULL)
	{
		T = new TreeNode(s);
	}
	else if (T->val > s)
		insert_Tree(T->left, s);
	else
		insert_Tree(T->right, s);
}

二叉搜索树的高度

int hight(BiTree root) {
	if (root == NULL)
		return 0;
	else if(hight(root->left)> hight(root->right)){
		return hight(root->left)+1;
	}
	else {
		return hight(root->right)+1;
	}
}

判断二叉树是否是完全二叉树

bool isWtree(BiTree root) {//是否是完全二叉树,只需要观察节点的孩子节点情况即可
	queue<TreeNode*> q;
	q.push(root);
	while (!q.empty()) {
		TreeNode* cur = q.front();
		q.pop();
		if (cur->left != NULL && cur->right != NULL)//1.孩子节点都有,则压入队列
		{
			q.push(cur->left);
			q.push(cur->right);
		}
		if (cur->left == NULL && cur->right != NULL)//2.有右孩子,无左孩子不是完全二叉树
			return false;
		if (cur->left != NULL && cur->right == NULL || cur->left == NULL && cur->right == NULL) {//3.没有孩子。4.有左孩子,无右孩子两种情况判断后续节点是否有孩子,如果有则不是完全二叉树。
			if (cur->left != NULL && cur->right == NULL)//有左孩子,无右孩子则先将孩子压入队列
				q.push(cur->left);
			while (!q.empty()) {
				cur = q.front();
				if (cur->left == NULL && cur->right == NULL)
					q.pop();
				else
					return false;
			}
			return true;
		}

	}
	return true;

}

根据由括号表示法的字符串创建二叉树

void CreateBTree(BiTree &b, string str)
{
	int length = str.length();
	BiTree St[100];
	int top = -1;
	TreeNode* p=NULL;
	b = NULL;
	int k;
	int n = 0;
	while (length--)
	{
		switch (str[n])
		{
		case'(':
			St[++top] = p;
			k = 1;
			break;
		case')':
			top--;
			break;
		case',':
			k = 2;
			break;
		default:
			p = new TreeNode(str[n]);
			if (b == NULL)
				b = p;
			else
			{
				switch (k)
				{
				case 1:St[top]->left = p; break;
				case 2:St[top]->right = p; break;
				}
				
			}
			break;
			
		}
		n++;
	}
}

根据括号表示法将二叉树输出

void print_Tree(TreeNode* root) {
	if (root == NULL)
		return;
	cout << root->val;
	if (root->left == NULL && root->right == NULL)
		return;
	else {
		cout << "(";
		if (root->left != NULL)
			print_Tree(root->left);
		cout << ",";
		if (root->right->val != NULL)
			print_Tree(root->right);
		cout << ")";
	}
}

将二叉排序树转换为双向链表

BiTree head = NULL;//双向链表的头指针
TreeNode* cur = NULL;//上一次遍历的根节点
void  double_Linknode(TreeNode* root) {//根据二叉排序树的性质,中序遍历构造递增的二叉链表
	if (root) {
		double_Linknode(root->left);
		if (cur)cur->right = root;
		else
			head = root;//如果上次遍历的根节点为空,说明此次遍历的根节点是最左侧节点,是二叉链表的头节点
		root->left = cur;
		cur = root;//保存上次的根节点
		double_Linknode(root->right);
	}
}

二叉树的宽度

int width(TreeNode* root) {
	queue<TreeNode*>q;
	q.push(root);
	int maxwidth = 0;
	while (!q.empty())//每一次的循环都是遍历一层,因此如果很容易知道树的高度,只需要记录循环几次便可。
	{
		int width = q.size();
		if (maxwidth < width)
			maxwidth = width;
		
		for (int i = 0;i < width;i++) {
			TreeNode* cur = q.front();
			q.pop();
			if (cur->left)
				q.push(cur->left);
			if (cur->right)
				q.push(cur->right);
		}
	}
	return maxwidth;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值