`
Touch_2011
  • 浏览: 290487 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

二叉查找树(C语言实现)

阅读更多
/*
 * 构造一颗二叉查找树,实现树的插入、删除等基本操作
 *
 */

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

typedef struct node
{
	int count;  //记录某个元素出现的次数
	int data;   //数据
    struct node * left;
	struct node * right;
}Node,*PNode;


int array[100];  //按序保存遍历后的元素
int k=0;         //数组array长度

//初始化一颗二叉排序树
PNode init()
{
	PNode p=(PNode)malloc(sizeof(Node));
	p->count=0;
	p->left=p->right=NULL;
	return p;
}

//插入结点
void insert(PNode root ,int data)
{
	if(root!=NULL&&root->count==0){//初始化后的第一个元素的count为0
		 root->data=data;
		 root->count++;
		 return;
	}
	if(data<root->data&&root->left==NULL){
        PNode p=(PNode)malloc(sizeof(Node));
    	p->data=data;
     	p->count=1;
    	p->left=p->right=NULL;
		root->left=p;
		return;
	}
	if(data>root->data&&root->right==NULL){
        PNode p=(PNode)malloc(sizeof(Node));
    	p->data=data;
     	p->count=1;
    	p->left=p->right=NULL;
		root->right=p;
		return;
	}
	if(data>root->data)
		insert(root->right,data);
	else if(data<root->data)
		insert(root->left,data);
	else{
		root->count++;
		return;
	}
}

//删除结点,删除成功返回1,失败返回0
int deleteNode(PNode* root ,int data)
{
	PNode p,q;
	//寻找要删除的结点
	if(*root==NULL)
		return 0;
	if((*root)->data==data){//找到要删除的结点
		//要删除的结点是叶子结点,直接删除
		if((*root)->left==NULL && (*root)->right==NULL){
            p=*root;
			*root=NULL;
			free(p);
			return 1;
		}
		//要删除的结点有左子树或者右子树,此时直接用左子树或右子树代替删除的结点
		if((*root)->left==NULL || (*root)->right==NULL){
            p=*root;
			*root=(*root)->left==NULL?(*root)->right:(*root)->left;
			p->left=p->right=NULL;
			free(p);
			return 1;
		}
		//要删除的结点有左子树和右子树。删除的结点的左子树代替删除的结点,然后
		//一直查找删除的结点的左子树的右子树,直到出现为空。把删除结点的右子树插入
		if((*root)->left && (*root)->right){
            p=*root;
            *root=(*root)->left;
			q=*root;
			while(q->right)
				q=q->right;
            q->right=p->right;
			p->left=p->right=NULL;
			free(p);
			return 1;
		}
	}else if((*root)->data>data){
        deleteNode(&(*root)->left,data);
	}else
        deleteNode(&(*root)->right,data);
    return 0;
}

//中序遍历
void  search_middle(PNode root)
{

	int i=0;
    if(root==NULL)
		return; 
	search_middle(root->left);  
	for(;i<root->count;i++)
		array[k++]=root->data;
    search_middle(root->right);
}

//先序遍历
void  search_prior(PNode root)
{

	int i=0;
    if(root==NULL)
		return; 
	for(;i<root->count;i++)
		array[k++]=root->data;
	search_prior(root->left);  
    search_prior(root->right);
}

//后序遍历
void  search_last(PNode root)
{

	int i=0;
    if(root==NULL)
		return; 
	search_prior(root->left);  
    search_prior(root->right);
	for(;i<root->count;i++)
		array[k++]=root->data;
}

//求树的高度
int tree_height(PNode root)
{
	int h1,h2;
	if(root!=NULL&&root->count==0)
		return 0;
	if(root==NULL)
		return 0;
	h1=1+tree_height(root->left);
	h2=1+tree_height(root->right);
	return h1>h2?h1:h2;
}

void main()
{
	int a[20];
	int *p=a;
	PNode pnode=init();
	int i,n,deleteElement;

	//读入要排序的数字个数和数字
	printf("please input n(n<20):\n");
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		printf("enter an Integer number:\n");
		scanf("%d",p++);
	}

	//把待排序的元素插入二叉查找树中
	for(i=0;i<n;i++){
		insert(pnode,*(a+i));
	}
	search_middle(pnode);
	printf("\n树的高度%d\n",tree_height(pnode)); 

	//输出排序后的元素序列
	for(i=0;i<k;i++)
		printf("%-5d",array[i]);
	printf("\n");
	

	//删除结点
	printf("请输入要删除的结点:\n");
	scanf("%d",&deleteElement);
    deleteNode(&pnode,deleteElement);

	k=0;
	search_middle(pnode);
	printf("\n删除后:树的高度%d\n",tree_height(pnode)); 

	//输出排序后的元素序列
	for(i=0;i<k;i++)
		printf("%-5d",array[i]);
	printf("\n");

	free(pnode);
}

 

0
0
分享到:
评论

相关推荐

    二叉查找树的C语言实现——插入,删除,查找

    在C语言中实现二叉查找树,我们需要定义一个结构体来表示树节点,包含节点的值以及指向左右子节点的指针。例如: ```c typedef struct Node { int data; struct Node* left; struct Node* right; } Node; ``` ...

    二叉排序树的C语言实现

    二叉排序树,又称二叉查找树或二叉搜索树,是一种特殊的二叉树数据结构,它具有以下特性:对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。这种性质使得...

    C语言实现二叉排序树构造 查找删除节点 中序遍历

    C语言实现二叉排序树构造 查找删除节点 中序遍历 已调试好

    c语言实现的用动态规划实现最优二叉查找树

    c语言实现的用动态规划实现最优二叉查找树,,,具体参见附件,2.txt中的内容为: 5 0.15 0.10 0.05 0.10 0.20

    C++实现的最优二叉查找树

    用C++实现的最优二叉查找树,简单,明了,是数据结构里经典必学算法,初学者适用

    二叉排序树 c语言 二叉排序树 查找

    读一个文件,文件中包含2000个以上英文名字 利用二叉数进行查找,在查找过程中避免 冲突的代码

    二叉检索树c语言版

    这些特性使得二叉检索树在查找、插入以及删除操作上具有较高的效率。本文档将基于给定的C语言版本二叉检索树代码进行详细分析,包括关键的数据结构定义、核心算法实现等。 #### 二、数据结构定义 本代码中,二叉...

    红黑树和二叉搜索树的C语言实现及性能比较

    本实验探讨了两种常见的自平衡二叉查找树——红黑树(Red-Black Tree)和二叉搜索树(Binary Search Tree),并用C语言实现了这两种数据结构,同时进行了性能比较。 首先,我们要理解二叉搜索树的基本特性。二叉...

    二叉查找树 减治法——C++代码

    二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉查找树中,对于任意节点,其左子树中的...

    二叉查找树练习

    实现`findwords`函数时,首先需要将文件中的单词提取出来,并且用二叉查找树进行存储。在C语言中,我们可以创建一个结构体来表示树节点,包括单词(key)和指向左右子节点的指针。初始化树时,可以创建一个空节点...

    二叉查找树c 源码

    在C语言中实现二叉查找树,我们需要定义一个结构体来表示树的节点,通常包括键、值以及指向左右子节点的指针。下面是一个简单的二叉查找树节点结构体定义: ```c typedef struct TreeNode { int key; void* value...

    数据结构二叉排序树C语言版

    二叉排序树(Binary Search Tree,BST),又称二叉查找树或有序二叉树,是一种特殊的二叉树,它的每个节点具有以下特性: - 节点中的键值大于所有左子树中的键值; - 节点中的键值小于所有右子树中的键值; - 左、右...

    二叉查找树的查找、删除、插入等基本操作(C语言)

    在提供的`searchTree`源码中,应该包含了对这些操作的详细实现,你可以通过阅读和理解代码来学习如何在C语言中操作二叉查找树。这将有助于你深入理解数据结构和算法,为今后的编程工作打下坚实的基础。

    c语言实现二叉搜索树

    1.实现二叉搜索树的基本操作 2.包括建立,查找,删除,显示 3.得到最长路径和最短路径,并能分别计算长度

    二叉查找树的编程与实现 C语言.pdf

    在C语言中实现二叉查找树时,通常需要定义一个结构体来表示节点。例如,可以定义如下的结构体: ```c typedef struct node { int data; struct node* lchild; struct node* rchild; } nodeb, *bitree; ``` 这里...

    二叉查找树实现源码(C、C++、JAVA)

    C、C++和Java实现二叉查找树时,通常会定义一个结构体(或类)来表示树节点,包括键值、指向左右子节点的指针以及可能的额外信息。对于C++和Java,还可以使用面向对象的方式,定义一个类来封装插入、查找和删除的...

    C语言数据结构二叉排序树完整源码

    二叉排序树(Binary Search Tree),也称作二叉查找树或有序二叉树,是一种特殊的二叉树结构。它具有以下性质: 1. 左子树上所有节点的值均小于它的根节点的值。 2. 右子树上所有节点的值均大于它的根节点的值。 3. ...

    数据结构 二叉排序树算法

    二叉排序树(Binary Search Tree, BST),也称为二叉查找树或者二叉搜索树,是一种特殊的二叉树,其中每个节点的左子树只包含键值小于该节点的节点;右子树只包含键值大于该节点的节点。插入操作通常按照以下步骤...

    基于二叉排序树的电话本C语言系统

    ### 基于二叉排序树的电话本C语言系统 #### 一、概述 本文档将详细介绍一个基于二叉排序树(Binary Search Tree, BST)实现的电话本系统。该系统采用C语言编写,主要功能包括:添加联系人、查找联系人、删除联系人...

    C语言实现二叉查找树(二插排序树)的基本操作。.zip

    在这个"C语言实现二叉查找树(二插排序树)的基本操作"的项目中,我们可能会看到以下几个关键知识点: 1. **数据结构定义**:首先,需要定义二叉查找树的节点结构,通常包含一个整型值(用于存储数据)、两个指针...

Global site tag (gtag.js) - Google Analytics