当前位置:   article > 正文

二叉排序树(BST)创建详解之C语言版_二叉排序树的创建

二叉排序树的创建

一、算法原理

二叉排序树(Binary Sort Tree或 Binary Search Tree)又称二叉查找树,可以用来实现数据的快速查找,也方便数据的插入、删除等工作,因此适用于数据的动态查找。
二叉排序树是一棵二叉树,其左子树上的元素都小于树根,右子树上的元素都大于树根,所有的子树也满足这个性质。
要想实现二叉排序树的查找,需要事先已经建立了二叉排序树。其原理很简单,如果已知一个数组,则首先把数组的第一个元素存储到树根。读入第二个元素的时候需要和树根进行比较,比树根小则存到左子树,否则存到右子树。读入第三个元素时,依旧先和树根进行比较,如果大于树根元素,则存入右子树,否则就与当前左子树树根进行比较,小的话则存入左子树的左子树。以后读入其它元素也是如此操作,就可以创建一棵二叉排序树。
下面以具体案例给出二叉排序树创建的详细过程。
Demo:
假设一组散乱数据:{ 18, 3, 7, 20, 14, 19, 27, 2 }
Step 1:创建二叉树,将18存入树根,结果如下图所示。
在这里插入图片描述
Step 2:取元素3,与树根18进行比较,此时小于18,所以存入左子树树根,结果如下图所示。

在这里插入图片描述
Step 3:取元素7,与树根18进行比较,小于18,再与左子树树根3比较,此时大于3,所以存入3的右子树位置,结果如下图所示。
在这里插入图片描述
Step 4:取元素20,与树根18进行比较,大于18,所以存入右子树树根位置,结果如下图所示。
在这里插入图片描述
Step 5:取元素14,与树根18进行比较,小于18,再与左子树树根3比较,大于3,接着与3的右子树树根7进行比较,大于7,所以插入7的右子树树根位置,结果如下图所示。
在这里插入图片描述
Step 6:取元素19,与树根18进行比较,大于树根,再与右子树树根20比较,小于20,所以插入到20的左子树位置,结果如下图所示。
在这里插入图片描述
Step 7:取元素27,与树根18进行比较,大于树根,再与右子树树根20比较,大于20,所以插入到20的右子树位置,结果如下图所示。
在这里插入图片描述
Step 8:取元素2,与树根18进行比较,小于18,再与左子树树根3比较,小于3,所以插入到3的左子树位置,结果如下图所示。
在这里插入图片描述
至此,完成了把该数组存入到一棵二叉排序树。

二、创建二叉排序树算法的C程序

1. 创建二叉排序树函数

void CreateBST( BST *T, int arr[], int n ) 
{
	BST *s, *p, *q; 
	int i; 
	T->data = arr[0]; 
	T->LChild = NULL; 
	T->RChild = NULL; 
	for( i = 1; i < n; i++ ) 
	{
		s = (BST *)malloc( sizeof(BST) ); 
		s->data   = arr[i];
		s->LChild = NULL;
		s->RChild = NULL;
		p = T;
		while( p != NULL )
		{
			if( s->data == p->data )
			{
				printf( "%d existed.\n", s->data );
				q = NULL;
				break; 
			}
			q = p;
			if( s->data < p->data )
			{
				p = p->LChild;
			}
			else if( s->data > p->data )
			{
				p = p->RChild;			
			}
		} 
		if( q != NULL && s->data < q->data )
		{
			q->LChild = s;
		}
		else if( q != NULL && s->data > q->data )
		{
			q->RChild = s;
		}	
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

2.测试代码(仅供参考)

#include"stdio.h" 
#include"malloc.h"

#define MAX_NODE 100

typedef struct node
{
	int data;
	struct node *LChild;
	struct node *RChild;
}BST;
void CreateBST( BST *T, int arr[], int n );
void  InorderSearch( BST *T );

int main()
{
	int arr[] = { 18, 3, 7, 20, 14, 19, 27, 2 };
	BST *T = ( BST * )malloc( sizeof( BST ) );
	CreateBST( T, arr, 8 );
	InorderSearch( T );
	return 0;
}
void CreateBST( BST *T, int arr[], int n ) 
{
	BST *s, *p, *q; 
	int i; 
	T->data = arr[0]; 
	T->LChild = NULL; 
	T->RChild = NULL; 
	for( i = 1; i < n; i++ ) 
	{
		s = (BST *)malloc( sizeof(BST) ); 
		s->data   = arr[i];
		s->LChild = NULL;
		s->RChild = NULL;
		p = T;
		while( p != NULL )
		{
			if( s->data == p->data )
			{
				printf( "%d existed.\n", s->data );
				q = NULL;
				break; 
			}
			q = p;
			if( s->data < p->data )
			{
				p = p->LChild;
			}
			else if( s->data > p->data )
			{
				p = p->RChild;			
			}
		} 
		if( q != NULL && s->data < q->data )
		{
			q->LChild = s;
		}
		else if( q != NULL && s->data > q->data )
		{
			q->RChild = s;
		}	
	}
}

void  InorderSearch( BST *T )
{
	if( T != NULL )
	{
		InorderSearch( T->LChild );
		printf( "%5d", T->data );
		InorderSearch( T->RChild );
	} 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

3.运行结果
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/709643
推荐阅读
相关标签
  

闽ICP备14008679号