数据结构课程设计 平衡二叉树 题目解答
寒之雨
2021年03月08日 10:27
收录于文集
共24篇

【基本要求】

(1)  生成一组随机数并输出。

(2)  建立平衡二叉排序树,并显示。

(3)  分别计算成功和失败的平均查找长度。

(4)  按数值递减次序输出数据。

(5)  功能:检索(输出依次比较的数据)、插入、删除。

解答:

#include<iostream>

#include<cmath>

#include<algorithm>

#include<ctime>

代码块
C++
自动换行
复制代码
#include
#include
#include
#include
using namespace std;
typedef struct node
{
	int data;
	struct node  *lchild,*rchild;
}bstnode;
class BST
{
	public:
		double sum1,sum2;
		bstnode *root;
		BST()
		{
			root=NULL;
		}
		void display(bstnode *b)
		{
			if(b!=NULL)
			{
				printf("%d",b->data);
				if(b->lchild!=NULL||b->rchild!=NULL)
				{
					printf("(");
					display(b->lchild);
					if(b->rchild!=NULL)
						printf(",");
					display(b->rchild);
					printf(")");
				}
			}
		}
		void ll(bstnode *&b)
		{
			bstnode *temp=b->lchild->rchild;
			b->lchild->rchild=b->rchild;
			b->rchild=b->lchild;
			b->lchild=b->rchild->lchild;
			b->rchild->lchild=temp;
			int a=b->data;
			b->data=b->rchild->data;
			b->rchild->data=a;
		}
		void rr(bstnode *&b)
		{
			bstnode *temp=b->rchild->lchild;
			b->rchild->lchild=b->lchild;
			b->lchild=b->rchild;
			b->rchild=b->lchild->rchild;
			b->lchild->rchild=temp;
			int a=b->data;
			b->data=b->lchild->data;
			b->lchild->data=a;
		}
		void lr(bstnode *&b)
		{
			rr(b->lchild);
			ll(b);
		}
		void rl(bstnode *&b)
		{
			ll(b->rchild);
			rr(b);
		}
		void balance(bstnode *&b)
		{
			int bf=balanum(b);
			if(bf>1)
			{
				if(balanum(b->lchild)>0)
				{
					//cout<<"LL"0)
					{
						//cout<<"RL"lchild=NULL;
				t->rchild=NULL;
				return t;
			}
			else
				if(k==t->data)
					return 0;
				else
					if(kdata)
						return insert(t->lchild,k,t);
					else
						return insert(t->rchild,k,t);
		}
		
		bool remove(bstnode *b);
		int hight(bstnode *b)//测量该节点的高度 
		{
			int lchildh,rchildh;
			if(b==NULL)return(0);
			else
			{
				lchildh=hight(b->lchild);
				rchildh=hight(b->rchild);
				return (lchildh>rchildh)?(lchildh+1):(rchildh+1);
			}
		}
		int balanum(bstnode *b)//计算该节点的平衡因子 
		{
			return hight(b->lchild)-hight(b->rchild);
		}
		void fixup(bstnode *&temp)//调整树 
		{
			while(1)
			{
				if(temp==NULL)
					return;
				if(balanum(temp)==2)
				{
					if(fabs(balanum(temp->lchild))==1)
					{
						//cout<<"找到失衡最小子树"rchild))==1)
						{
							//cout<<"找到失衡最小子树"lchild);
						fixup(temp->rchild);
						return;
					}
			}	
		}
		void creat(int a[],int n)
		{
			root=NULL;
			int i=0;
			while(idatalchild);
				else
					return 1+com(x,n->rchild);	
		}
		void inorder(bstnode *b)
		{
			if(b!=NULL)
			{
				inorder(b->lchild);
				printf("%3d",b->data);
//				cout<<" "lchild==NULL)
					sum2+=(com(b->data,root)+1);
				if(b->rchild==NULL)
					sum2+=(com(b->data,root)+1);
				inorder(b->rchild);
			}
		}
		void sussess()
		{
			sum1=0;
			sum2=0;
			inorder(root);
			coutrchild)
					n=n->rchild;
			return n;
		}
		bstnode *min(bstnode *n)
		{
			if(n!=NULL)
				while(n->lchild)
					n=n->lchild;
			return n;
		}
		void del(bstnode *n,bstnode *p, int d)
		{
			bstnode *temp=NULL;
			if(n==NULL)
			{
				cout<<"未找到该数据"lchild,n,d);
				else
					if(d>n->data)
						return del(n->rchild,n,d);
					else
						if(n->lchild&&n->rchild)
						{
							if(hight(n->lchild)>hight(n->rchild))
							{
								temp=max(n->lchild);
								n->data=temp->data;
								return del(n->lchild,n,n->data);
							}
							else
							{
								temp=min(n->rchild);
								n->data=temp->data;
								return del(n->rchild,n,n->data);
							}
						}
						else
						{
							if(n->lchild&&n->rchild==NULL)
							{
								temp=max(n->lchild);
								n->data=temp->data;
								return del(n->lchild,n,n->data);
							}
							else
								if(n->rchild&&n->lchild==NULL)
								{
									temp=min(n->rchild);
									n->data=temp->data;
									return del(n->rchild,n,n->data);
								}
								else
								{
									if(p!=NULL)
										if(n==p->lchild)
											p->lchild=NULL;
										else
											p->rchild=NULL;
									delete n;
									n=NULL;
									fixup(root);
								}
						}
							
		}
};
void randata(int datas[])
{
    srand(time(0));
	for(int i=0;i<10;i++)
		datas[i]=rand()%100;
}
int main()
{
	int datas[10]={16,3,7,11,9,26,18,14,15,1};
	randata(datas);
	
	cout<<"生成10个数据:"<>chos;
		switch(chos)
		{
			case 1:
				int findnum;
				cout<<"请输入需要检索的数据:";
				cin>>findnum;
				bst.find(findnum,bst.root); 
				break;
			case 2:
				int insnum;
				cout<<"请输入需要插入的数据:";
				cin>>insnum;
				bst.insert(bst.root,insnum,NULL);
				bst.fixup(bst.root);
				cout<>delnum;
				bst.del(bst.root,NULL,delnum);
				cout<
复制成功

cout<<endl;

bst.display(bst.root);

cout<<endl;

break;

case 3:

int delnum;

cout<<"请输入需要删除的数据:&#​34;;

cin>>delnum;

bst.del(bst.root,NULL,delnum);

cout<<endl;

bst.display(bst.root);

cout<<endl;

break;

default:cout<<"非法输入,&#​34;; 

}

}

return 0;