数据结构 | 二叉查找树(二叉搜索/排序树)详细代码

1.二叉树的结构

typedef struct tinode{
	int data;
	struct tinode *lc,*rc;
}tinode,*tnode;

2.把元素插入二叉查找树(构造二叉查找树)

void insert(tnode &t,int item){
	if(!t){ 
		t = (tnode)malloc(sizeof(tinode));
		t->data = item;
		t->lc = t->rc = NULL;
	}
	else{
		if(item<t->data)    //要插入的元素小于当前结点,插入当前结点的左子树 
		    insert(t->lc,item);
		else if(item>t->data,item)
		    insert(t->rc,item);
	}
}

3.删除元素

tnode del(tnode &t,int item){
	tnode temp;
	if(!t) printf("要删除的元素未找到");
	else{
		if(item<t->data)
		    del(t->lc,item);
		else if(item>t->data)
		    del(t->rc,item);
		else if(t->lc&&t->rc){ //要删除的结点有左右子树
			temp = findmin(t->rc); //要删除的结点的右子树里最小的元素
			t->data = temp->data;
			t->rc = del(t->rc,t->data);
		}
		else{
			temp = t;
			if(!t->lc)
			    t = t->rc;
			else if(!t->rc)
			    t = t->lc;
			free(temp);
		}
	}
	return t;
}

4.findmin()函数

tnode findmin(tnode &t){
	tnode temp = t;
	while(temp->lc) temp = temp->lc; //左子树总是比右子树小
	printf("右子树最小值为%d\n",temp->data);
	return temp;
}

5.完整代码

#include<stdio.h>
#include<stdlib.h>

typedef struct tinode{
	int data;
	struct tinode *lc,*rc;
}tinode,*tnode;


void insert(tnode &t,int item){
	if(!t){    
		t = (tnode)malloc(sizeof(tinode));
		t->data = item;
		t->lc = t->rc = NULL;
	}
	else{
		if(item<t->data)    //要插入的元素小于当前结点,插入当前结点的左子树 
		    insert(t->lc,item);
		else if(item>t->data,item)
		    insert(t->rc,item);
	}
}

tnode findmin(tnode &t){
	tnode temp = t;
	while(temp->lc) temp = temp->lc;
	printf("右子树最小值为%d\n\n",temp->data);
	return temp;
}

tnode del(tnode &t,int item){
	tnode temp;
	if(!t) printf("要删除的元素未找到");
	else{
		if(item<t->data)
		    del(t->lc,item);
		else if(item>t->data)
		    del(t->rc,item);
		else if(t->lc&&t->rc){
			temp = findmin(t->rc);
			t->data = temp->data;
			t->rc = del(t->rc,t->data);
		}
		else{
			temp = t;
			if(!t->lc)
			    t = t->rc;
			else if(!t->rc)
			    t = t->lc;
			free(temp);
		}
	}
	return t;
}

void pre_traver(tnode &t){
	if(t){
		printf("%d ",t->data);
	    pre_traver(t->lc);
	    pre_traver(t->rc);
	}
}


int main()
{
	tnode t = NULL;
	
	insert(t,30);
	insert(t,15);
	insert(t,41);
	insert(t,33);
	insert(t,50);
	insert(t,35);
	insert(t,34);
	
	printf("删除前,前序遍历为:");
	pre_traver(t);
	printf("\n\n");
	
	del(t,30); //删除30 
	  
	printf("删除后,前序遍历为:");
	pre_traver(t);
}

6.运行结果

删除30

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值