数据结构课程设计-二叉树操作系统

二叉树操作系统(二叉排序树)头文件部分:
#define INF 0xffffff
void Insert_BTree(BTree *root,DataType data)
{
	BTree s;
	if(*root==NULL)   //明白这样子写代码的思路吗
	{            
		s=(BTNode *)malloc(sizeof(BTNode));        //什么时候在非初始化函数形参内用二级指针或者引用类型
		s->data=data; 
		s->lchild=NULL;
		s->rchild=NULL;
		*root=s;
	}
	else if((*root)->data>data)
		Insert_BTree(&((*root)->lchild),data);
	else if((*root)->data<data)
		Insert_BTree(&((*root)->rchild),data);
}

int Search_BTree(BTree root,DataType data)   //二叉排序树查找操作
{
	BTNode *p;
	p=root;
	while(p)
	{
		if(p->data==data)
			return p->data;
		if(p->data>data)
			p=p->lchild;
		else
			p=p->rchild;
	}
	return INF;
}

void Create_BTree(BTree *root)
{
	int i,data,cnt;
	*root=NULL;
	printf("请输入二叉排序树节点的数目:\n");
	scanf("%d",&cnt);
	printf("请输入各节点数据,相邻数据之间用空格隔开:\n");
	for(i=1;i<=cnt;i++)
	{
		scanf("%d",&data);
		Insert_BTree(root,data);
	}
}

void Delete_BTree(BTree root,DataType data)
{
	BTree p,father,sc,q;
	p=root;
	father=NULL;     
	while(p)    //匹配元素data或者p==NULL时跳出循环
	{
		if(p->data==data)   //匹配后p就是要被删除的节点
			break;
		father=p;       //father总是存放p的父亲节点 
		if(p->data>data)
			p=p->lchild;
		else if(p->data<data)
			p=p->rchild;
	}
	if(p==NULL)    //开始分类讨论 
	{
		printf("元素不存在,删除失败!!!\n");
		return ;
	}
	if(p->lchild==NULL)   //删除与插入仍然要符合二叉排序树的性质
	{
		if(father->lchild==p)
			father->lchild=p->rchild;
		else
			father->rchild=p->rchild;
		free(p);
	}
	else      //p的左子树不为空 
	{             //既然p左子树不为空,那我肯定是要找左子树的最大节点
		q=p;       //或者是右子树的最小节点,但是        
		sc=p->lchild;
		while(sc->rchild)   //这种方式直到sc为叶子节点或者只有左子树的节点
		{                   //最终sc就是p左子树的最大节点 
			q=sc;
			sc=sc->rchild;     
		}
		if(q==p)   //此时p节点的右子树为空 
			q->lchild=sc->lchild;
		else    //此时p的左子树的右子树不为空,
			q->rchild=sc->lchild;  //想想为什么是这样,因为这样才能维持二叉排序树的性质
		p->data=sc->data;
		free(sc);
	}
}

void In_order_Rec_BST(BTree root)
{
	if(root)
	{
		In_order_Rec_BST(root->lchild);
		printf("%d ",root->data);
		In_order_Rec_BST(root->rchild);
	}
}

void Fuction_BTree(BTree root) 
{ 
    int data,chioce,t;
	system("cls");
	printf("\t    二叉排序树应用             \n");
    printf("\t     1. 创建二叉               \n"); 
    printf("\t     2. 搜索节点               \n"); 
    printf("\t     3. 插入节点               \n"); 
    printf("\t     4. 删除节点               \n"); 
    printf("\t     0. 退出                   \n"); 
	printf("请输入相应操作: \n"); 
    scanf("%d",&chioce); 
    while(!(chioce>=0&&chioce<=4))   //输入序号不存在,操作出错 
	{             
		printf("输入有问题,请重新输入:"); 
		scanf("%d",&chioce); 
	} 
	while(chioce!=0)
	{                           //建立循环选择不同的操作 
        switch(chioce)
		{ 
			case 1:                           //选择操作1即二叉排序树的创建 
                printf("创建二叉树: \n"); 
                Create_BTree(&root); 
                In_order_Rec_BST(root); 
                printf("\n"); 
                break; 
			case 2:                       //选择操作2即在二叉排序树中进行查找 
                printf("请输入你想搜索的节点存储元素信息: \n"); 
                scanf("%d",&data); 
                t=Search_BTree(root,data); 
                if(t!=INF)
				{ 
                    printf("查找成功: "); 
                    printf("%d\n",t); 
                } 
                else 
					printf("关键字不存在\n"); 
                break;
			case 3:      //选择操作3即在二叉排序树中进行插入操作 
				printf("请输入你想插入的节点存储元素信息: \n"); 
                scanf("%d",&data); 
                Insert_BTree(&root,data); 
                In_order_Rec_BST(root); 
                printf("\n"); 
                break; 
			case 4:    //选择操作4即在二叉排序树中进行删除操作 
                printf("请输入你想删除的节点存储信息: \n"); 
                scanf("%d",&data); 
                Delete_BTree(root,data); 
                In_order_Rec_BST(root); 
                printf("\n"); 
                break;  
        } 
        printf("请继续进行相应操作:"); 
        scanf("%d",&chioce); 
    } 
    return ; 
} 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
树状显示二叉树: 编写函数displaytree(二叉树的根指针,数据值宽度,屏幕的宽度)输出树的直观示意图。输出的二叉树是垂直打印的,同层的节点在同一行上。 [问题描述] 假设数据宽度datawidth=2,而屏幕宽度screenwidth为64=26,假设节点的输出位置用 (层号,须打印的空格数)来界定。 第0层:根在(0,32)处输出; 第1层:因为根节点缩进了32个空格,所以下一层的偏移量(offset)为32/2=16=screenwidth/22。即第一层的两个节点的位置为(1,32-offset),(1,32+offset)即(1,16),(1,48)。 第二层:第二层的偏移量offset为screenwidth/23。第二层的四个节点的位置 分别是(2,16-offset),(2,16+offset),(2,48-offset),(2,48+offset)即(2,8),(2,24),(2,40),(2,56)。 …… 第i层:第i层的偏移量offset为screenwidth/2i+1。第i层的每个节点的位置是访问第i-1层其双亲节点时确定的。假设其双亲的位置为(i-1,parentpos)。若其第i层的节点是其左孩子,那末左孩子的位置是(i,parentpos-offset),右孩子的位置是(i,parentpos+offset)。 [实现提示] 利用二叉树的层次遍历算法实现。利用两个队列Q,QI。队列Q中存放节点信息,队列QI中存相应于队列Q中的节点的位置信息,包括层号和需要打印节点值时需要打印的空格数。当节点被加入到Q时,相应的打印信息被存到QI中。二叉树本身采用二叉链表存储。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值