二叉排序树的增,删,和查找操作(C语言)

二叉排序查找树

来自《大话数据结构》中的解释:
二叉排序树(Binary Sort Tree),又称二叉查找树,它或者是一个树,或者具有以下性质的二叉树:

  1. 若它的左子树不空,则左子树上所有节点的值均小于它根节点的值;
  2. 若它的右子树不空,则右子树上所有节点的值均大于它根节点的值;
  3. 它的左、右二叉树也分别为二叉排序树。

常用的二叉排序树抽象数据结构类型有:查找插入删除遍历等操作。首先来构造一棵树:

typedef struct BiNode
{
	int data; //节点的数据域.
	struct BiNode * lchild, * rchild; //lchild指向左子树,rchild指向右子树.
}BiNode, *BiTree;

查找操作

先来看一下二叉排序树的查找操作:

//T表示树结构,key表示要查找的关键字,f一般默认值为NULL,*p为指向key节点的地址。
bool SearchBitree(BiTree T, int key, BiTree f, BiTree *p) //查找树中的数据
{
	if(!T) //如果树为空
	{
		*p = f;
		return false;
	}
	else if(key == T->data)
	{
		*p = T;
		return true;
	}
	else if(key < T->data)
	{
		return SearchBitree(T->lchild, key, T, p);
	}
	else
	{
		return SearchBitree(T->rchild, key, T, p);
	}
}

插入操作

bool InsertBST(BiTree *T, int key) //将数据插入到树中
{
	BiNode *p;
	if(!SearchBitree(*T, key, NULL, &p)) //如果查找不成功,执行插入操作.
	{
		BiTree pNew = (BiTree)malloc(sizeof(BiNode));
		if(NULL==pNew)
		{
			printf("内存分配失败!");
		}
		pNew->data = key;
		pNew->lchild = NULL;
		pNew->rchild = NULL;
		
		if(!p)
		{
			*T = pNew;		
		}
		else if(key<p->data)
		{
			p->lchild = pNew;	
		}
		else
		{
			p->rchild = pNew;	
		}	
		return true;
	}
	else
		return false;
}

二叉排序树的遍历

二叉排序树因为是【左边的值<中间的值<右边的值】,所以用的是中序遍历,需要用到递归操作,代码如下:

void Traverse(BiTree T)   //中序递归遍历二叉树
{
	if (NULL == T)
		return;
	//中序排序:213,前序排序123,后序排序231.
	Traverse(T->lchild);  // 2
	printf("%d ", T->data); // 1
	Traverse(T->rchild);  // 3
}

删除操作

bool Delete(BiTree *p)
{
	BiTree q, s;
	if((*p)->lchild == NULL)
	{
		q = *p;
		*p = (*p)->rchild;
		free(q);
	}
	else if((*p)->rchild == NULL)
	{
		q = *p;
		*p = (*p)->lchild;
		free(q);
	}
	else
	{
		q = *p;
		s = (*p)->lchild;
		while(s->rchild)
		{
			q = s;
			s = s->rchild;
		}
		if(q!=*p)
			q->rchild = s->lchild;
		else
			q->lchild = s->lchild;
	}
	return true;
}

bool DeleteBST(BiTree *T, int key) // 删除树中的数据
{
	if(*T != NULL)
	{
		if(key == (*T)->data)
		{
			return Delete(T);
		}
		else if(key < (*T)->data)
		{
			return DeleteBST(&(*T)->lchild, key);
		}
		else
		{
			return DeleteBST(&(*T)->rchild, key);
		}
	}
	else
	{
		printf("此树为空,删除失败!\n");
		return false;
	}
}

下面把整段代码附上:

#include<stdio.h>
#include<malloc.h>

typedef struct BiNode
{
	int data;
	struct BiNode * lchild, * rchild;
}BiNode, *BiTree;

bool Delete(BiTree *p)
{
	BiTree q, s;	
	if((*p)->lchild == NULL)
	{
		q = *p;
		*p = (*p)->rchild;
		free(q);
	}
	else if((*p)->rchild == NULL)
	{
		q = *p;
		*p = (*p)->lchild;
		free(q);
	}
	else
	{
		q = *p;
		s = (*p)->lchild;

		while(s->rchild)
		{
			q = s;
			s = s->rchild;
		}
		if(q!=*p)
			q->rchild = s->lchild;
		else
			q->lchild = s->lchild;
	}
	return true;
}

bool DeleteBST(BiTree *T, int key) // 删除树中的数据
{
	if(*T != NULL)
	{
		if(key == (*T)->data)
		{
			return Delete(T);
		}
		else if(key < (*T)->data)
		{
			return DeleteBST(&(*T)->lchild, key);
		}
		else
		{
			return DeleteBST(&(*T)->rchild, key);
		}
	}
	else
	{
		printf("此树为空,删除失败!\n");
		return false;
	}
}

bool SearchBitree(BiTree T, int key, BiTree f, BiTree *p) //查找树中的数据
{
	if(!T)
	{
		*p = f;
		return false;
	}
	else if(key == T->data)
	{
		*p = T;
		return true;
	}
	else if(key < T->data)
	{
		return SearchBitree(T->lchild, key, T, p);
	}
	else
	{
		return SearchBitree(T->rchild, key, T, p);
	}
}

bool InsertBST(BiTree *T, int key) //将数据插入到树中
{
	BiNode *p;
	if(!SearchBitree(*T, key, NULL, &p))
	{
		BiTree pNew = (BiTree)malloc(sizeof(BiNode));
		if(NULL==pNew)
		{
			printf("内存分配失败!");
		}
		pNew->data = key;
		pNew->lchild = NULL;
		pNew->rchild = NULL;
		
		if(!p)
		{
			*T = pNew;		
		}
		else if(key<p->data)
		{
			p->lchild = pNew;	
		}
		else
		{
			p->rchild = pNew;	
		}	
		return true;
	}
	else
		return false;

}

void Traverse(BiTree T)   //中序递归遍历二叉树
{
	if (NULL == T)
		return;
	Traverse(T->lchild);
	printf("%d ", T->data);
	Traverse(T->rchild);	
}

int main(void)
{
	
	BiNode * T = NULL;
	int i;
	int a[10] = {62,88,58,47,35,73,51,99,37,93};

	for(i=0;i<10;i++)
	{
		InsertBST(&T, a[i]);
	}	
	printf("删除前: \n");
	Traverse(T);
	printf("\n");

	printf("删除后: \n");
	DeleteBST(&T,62);
	DeleteBST(&T,35);
	DeleteBST(&T,73);
	DeleteBST(&T,51);
	DeleteBST(&T,93);
	Traverse(T);
	printf("\n");

	return 0;

}

运行结果如下:在这里插入图片描述

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是用C语言实现二叉排序树的动态查找表代码: ```c #include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *left; struct node *right; } Node; Node* create_node(int data) { Node *new_node = (Node*) malloc(sizeof(Node)); new_node->data = data; new_node->left = NULL; new_node->right = NULL; return new_node; } void insert(Node **root, int data) { if (*root == NULL) { *root = create_node(data); return; } if (data < (*root)->data) { insert(&(*root)->left, data); } else { insert(&(*root)->right, data); } } Node* find(Node *root, int data) { if (root == NULL || root->data == data) { return root; } if (data < root->data) { return find(root->left, data); } else { return find(root->right, data); } } void inorder(Node *root) { if (root != NULL) { inorder(root->left); printf("%d ", root->data); inorder(root->right); } } int main() { Node *root = NULL; insert(&root, 50); insert(&root, 30); insert(&root, 70); insert(&root, 20); insert(&root, 40); insert(&root, 60); insert(&root, 80); printf("Inorder traversal of the BST: "); inorder(root); printf("\n"); Node *search_result = find(root, 60); if (search_result != NULL) { printf("Found %d\n", search_result->data); } else { printf("Not found\n"); } return 0; } ``` 这段代码,我们定义了一个二叉树节点结构体,包含一个整数类型的数据域,以及指向左右子节点的指针。我们通过create_node函数创建一个新节点,通过insert函数向二叉排序树插入新节点,通过find函数在二叉排序树查找指定元素,并返回对应的节点指针。我们还通过inorder函数实现序遍历,以便对整个二叉排序树进行遍历和输出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值