欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

小代碼向原文學習BST簡單的C語言版本

 
 /********************************
 運行環(huán)境:http://www.anycodes.cn/zh/
 原文:http://blog.csdn.net/u014488381/article/details/41719765/
 二叉排序樹的查找算法的C代碼實現(xiàn)
 修改以直接測試
 待C++類封裝版本
 *********************************/
#include <stdio.h>
#include <stdlib.h>
typedef int Elemtype;
typedef struct BiTNode{
	Elemtype data;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

/*/在給定的BST中插入結(jié)點,其數(shù)據(jù)域(數(shù)值)為element/*/
void BSTInsert( BiTree *t, Elemtype element )
{/*/每次插入 開辟空間/*/
	if( NULL == *t ) {
		(*t) = (BiTree)malloc(sizeof(BiTNode));
		(*t)->data = element;
		(*t)->lchild = (*t)->rchild = NULL;
	}
/*/依據(jù)二叉搜索樹性質(zhì)/*/
	if( element == (*t)->data ) return ; /*/不允許有重復(fù)的數(shù)據(jù),若遇到直接不處理/*/
	else if( element < (*t)->data ) BSTInsert( &(*t)->lchild, element );
	     else                       BSTInsert( &(*t)->rchild, element );
}

/*/創(chuàng)建BST/*/
void CreateBST( BiTree *t, Elemtype *a, int n )
{
	(*t) = NULL;
	for( int i=0; i<n; i++ )
		BSTInsert( t, a[i] );
}

/*/BST的遞歸查找/*/
void SearchBST( BiTree t, Elemtype key )
{
	BiTree p;  p = t;
	if( p ) {
		if( key == p->data )
			printf("查找成功!\n");
		else if( (key < p->data) && (NULL != p->lchild) )
			SearchBST( p->lchild , key );
		else if( (key > p->data) && (NULL != p->rchild) )
			SearchBST( p->rchild , key );
		else
			printf("無此元素!\n");
	}
}

/*/BST的迭代查找/*/
void _SearchBST( BiTree t, Elemtype key )
{
	BiTree p;  p = t;
	while( NULL != p && key != p->data ) /*/結(jié)點存在而數(shù)值不等時/*/
	{
		if( key < p->data )  p = p->lchild ;
		 else 	         	p = p->rchild ;
	}/*/ 走出循環(huán)后 p指針總是指向找到的元素 或者 葉子結(jié)點下的空結(jié)點/*/
	if( NULL != p ) printf("查找成功!\n");
	 else    	    printf("無此元素!\n");
}

/*/BST結(jié)點的刪除    本二叉樹內(nèi)容重點/*/
void DelBSTNode( BiTree t, Elemtype key )
{
	BiTree p, q;
	p = t;
	Elemtype temp;
	/*/ 先遍歷找這元素/*/
	while( NULL != p && key != p->data ) {
		q = p; /*/ q總是在結(jié)點p的上方(當p不是根結(jié)點時q總是父親)
             p就是我們要刪的元素
		/*/
		if( key < p->data )			p = p->lchild ;
		else		p = p->rchild ;
	}
	if( NULL == p )  printf("無此元素!\n");
	/*/找到元素  會有如下幾個情況
     1.         2.              3.
      q            q                   q
      /\          / \                 /  \  
     p  p        p   p               p     p
	             /     \             / \   / \  
	            x       x           x   x  x  x
	 /*/        
	else {
		/*/情況1:結(jié)點p的雙親結(jié)點為q,且p為葉子結(jié)點,則直接將其刪除。/*/
		if( NULL == p->lchild && NULL == p->rchild ) {
			if( p == q->lchild ) q->lchild = NULL;
			if( p == q->rchild ) q->rchild = NULL;
			free(p);
			p = NULL;
		}
		/*/情況2:結(jié)點p的雙親結(jié)點為q,且p只有左子樹或只有右子樹,
		則可將p的左子樹或右子樹直接改為其雙親結(jié)點q的左子樹或右子樹。/*/
		else if( (NULL == p->rchild && NULL != p->lchild) ) {	/*/p只有左子樹/*/
			if( p == q->lchild )				q->lchild = p->lchild ;
			else if( p == q->rchild )			q->rchild = p->lchild ;
			free(p);
			p = NULL;
		}
		else if( NULL == p->lchild && NULL != p->rchild ) {		/*/p只有右子樹/*/
			if( p == q->lchild )				q->lchild = p->rchild ;
			if( p == q->rchild )				q->rchild = p->rchild ;
			free(p);
			p = NULL;
		}
		/*/情況3:結(jié)點p的雙親結(jié)點為q,且p既有左子樹又有右子樹。
		本代碼使用直接前驅(qū)(也可以直接后繼)這里找的是左子樹中最大的元素/*/	
		else if( NULL != p->lchild && NULL != p->rchild ) {
				BiTree s, sParent;
				sParent = p;
				s = sParent->lchild ;
				while( NULL != s->rchild )	{/*/找到p的直接前驅(qū)/*/
					sParent = s;
					s = s->rchild ;	      /*/左子樹最大的總是在左子樹中最右下角/*/
				}
				temp = s->data ;	    /*/此時 s指向的是最大的右下葉子結(jié)點 為一般情況1 直接刪除/*/
				DelBSTNode( t, temp );
				p->data = temp;   /*/最后將原來要刪除的p的數(shù)據(jù)改為temp/*/
		}
	}

}

/*/
待遞歸版本的刪除 傳引用的妙處
中序遍歷打印BST/*/
void PrintBST( BiTree t )
{
	if( t ) {
		PrintBST( t->lchild );
		printf("%d ", t->data);
		PrintBST( t->rchild );
	}
}

void use()
{
	int n;
	int *a;
	Elemtype key;
	BiTree t;

	printf("請輸入二叉查找樹的結(jié)點數(shù):\n");
	scanf("%d", &n);

	a = (int *)malloc(sizeof(int)*n);
	printf("請輸入二叉找樹的結(jié)點數(shù)據(jù):\n");
	for( int i=0; i<n; i++ )
		scanf("%d", &a[i]);
	CreateBST( &t, a, n );
	printf("當前二叉查找樹的中序遍歷結(jié)果為:\n");
	PrintBST( t );
	printf("\n##############################################\n");
	
	printf("請輸入要查找的元素:\n");
	scanf("%d", &key);
	printf("BST遞歸查找結(jié)果:\n");
	SearchBST( t, key );		//遞歸查找

	printf("##############################################\n");
	printf("請輸入要刪除的元素:\n");
	scanf("%d", &key);
	DelBSTNode( t, key );
	printf("當前二叉查找樹的中序遍歷結(jié)果為:\n");
	PrintBST( t );
	printf("\n##############################################\n");

	printf("請輸入要查找的元素:\n");
	scanf("%d", &key);
	printf("BST迭代查找結(jié)果:\n");
	_SearchBST( t, key );		//迭代查找
 
}
void test()
{
	int n;  
	Elemtype key;   BiTree t;
    int a[]={5,8,2,1,4,7,9,6,3};
	printf("請輸入二叉查找樹的結(jié)點數(shù):\n");
    n=9;
	printf("請輸入二叉找樹的結(jié)點數(shù)據(jù):\n");
	CreateBST( &t, a, n );
	printf("當前二叉查找樹的中序遍歷結(jié)果為:\n");
	PrintBST( t );
	printf("\n##############################################\n");
	
	printf("請輸入要查找的元素:\n");
	key=8;
	printf("BST遞歸查找結(jié)果:\n");
	SearchBST( t, key );		//遞歸查找

	printf("##############################################\n");
	printf("請輸入要刪除的元素:\n");
	 key=5;
	DelBSTNode( t, key );
	printf("當前二叉查找樹的中序遍歷結(jié)果為:\n");
	PrintBST( t );
	printf("\n##############################################\n");

	printf("請輸入要查找的元素:\n");
	 key=5;
	printf("BST迭代查找結(jié)果:\n");
	_SearchBST( t, key );		//迭代查找
 
}
int main(void)
{
	printf("Hello,C world of AnycodeX!\n");
	test();
	return EXIT_SUCCESS;
}

當前名稱:小代碼向原文學習BST簡單的C語言版本
分享地址:http://aaarwkj.com/article4/pjsooe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷微信小程序、電子商務(wù)、、網(wǎng)站收錄品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
粗长挺进新婚人妻诗岚| 亚洲午夜精品久久久天堂| 在线观看视频免费午夜| 日韩亚洲av在线免费观看| 亚洲精品中文字幕一二三| 亚洲成色在线综合剧情网站 | 永久免费成人在线视频| 日本一区二区国产在线| 日本一区二区欧美在线| 日韩av不卡免费播放| 日韩精品一区二区三区欲色av| 国产午夜精品一区二区三区| 亚洲男人的天堂社区av| 91国产自拍在线视频| 日本高清一区二区高清| 人人妻人人澡人人爽人人老司机| 邻居少妇扒开腿让我爽了一夜| 国产国产人免费人成免费人妖| 成人爱爱免费观看视频| 成人午夜黄色福利视频| 久久久人妻精品一区二区三区四区| 日韩黄色一级片免费看| 亚洲欧美综合一区二区三区| 亚洲国产精品一区二区av| 亚洲欧美日韩精品成人| 欧美十八一区二区三区| 久碰精品少妇中文字幕av| 未满十八禁止在线播放| 国产午夜精品自拍视频| 麻豆av永久地址久久精品| 欧美日韩国产综合精品亚洲| 欧美综合亚洲韩精品区| 中文字幕在线看精品乱码| 国产精品色呦呦一区二区| 国产日韩欧美高清免费视频| 日韩精品专区在线影院重磅 | 97乱碰视频在线观看| 午夜影院免费在线观看五分钟| 国产日韩欧美另类综合| 欧美国产综合欧美一区二区三区 | 黄色国产一区二区三区|