1. 程式人生 > >資料結構之二叉排序樹的建立

資料結構之二叉排序樹的建立

一、普通二叉樹的建立

    提到二叉樹的建立,就不得不提一下“遞迴”,建立二叉樹所採用的思想就是遞迴。

遞迴基本形式:  

void recursion()
{
	if(遞迴結束條件)
	{
		表示式
	}
	else
	{
		表示式;
		recursion();
	}
}

    有了遞迴思想後,我們如何建立二叉樹呢?比如建立如圖的二叉樹:


問題:發現此二叉樹並不是完全二叉樹,有的只有右孩子沒有左孩子,這樣的話,可以在輸入時人為的假定一個虛擬的空孩子比如用65535表示空結點,具體如下:

程式碼實現:

/*****************普通二叉樹的建立與遍歷************/
void CreateBiTree(tNode *T)     /*二叉樹的建立*/
{
	int ch;
	scanf("%d", &ch);
	if(0 == ch)
		*T = NULL;
	else
	{
		*T = (tNode)malloc(sizeof(node));
		if(!*T)
			exit(OVERFLOW);
		(*T)->data = ch;  
		CreateBiTree(&(*T)->lchild);  //構造左子樹
		CreateBiTree(&(*T)->rchild);    //構造右子樹
	}		
}

二、二叉排序樹的建立

    二叉排序樹的建立比普通二叉樹多了一點就是在建立的過程中需要對插入進來的資料進行大小的判斷,但是就是因為多了這麼一點,所以不能在遞迴的過程中去輸入資料並插入,而是應該先輸入資料,再將資料插入。

    插入的過程中要將資料與樹的根結點的值開始比較知道找到合適的位置插入,所以在插入資料的這一部分程式碼中可以使用遞迴演算法。

實現程式碼:

void creatBT(tNode *tree)   
{
	*tree = (tNode)malloc(sizeof(node));  //這已經給他的左右孩子分配了記憶體地址,所以要將他的左右孩子只想NULL
	(*tree)->lchild = NULL;
	(*tree)->rchild = NULL;
	
	int c ;
	scanf("%d",&c);
	
	if((*tree) != NULL && 65535 != c)   //以65535為結束標誌
		(*tree)->data = c;   //建立根節點
		

	while(65535 != c)
	{
		scanf("%d",&c);
		if((*tree) != NULL && 65535 != c)	
			insertChild(tree, c);
	}

}

//寫一個函式專門插入子孩子,採用遞迴,從根節點開始尋找合適的插入點
void insertChild(tNode *tree, int c)
{
	if(c < (*tree)->data)  
	{
		if( (*tree)->lchild == NULL )   //如果沒有左孩子,直接將值賦給左孩子
		{
			(*tree)->lchild = (tNode)malloc(sizeof(node));  //這已經給他的左右孩子分配了記憶體地址,所以要將他的左右孩子只想NULL
			((*tree)->lchild)->lchild = NULL;
			((*tree)->lchild)->rchild = NULL;

			(*tree)->lchild->data = c;
		}
			
	
		else
		{
			insertChild(&((*tree)->lchild),c);		
		}
	}
	
	else
	{
		if( (*tree)->rchild == NULL )   //如果沒有左孩子,直接將值賦給左孩子
		{
			(*tree)->rchild = (tNode)malloc(sizeof(node));   //這已經給他的左右孩子分配了記憶體地址,所以要將他的左右孩子只想NULL
			((*tree)->rchild)->lchild = NULL;
			((*tree)->rchild)->rchild = NULL;

			(*tree)->rchild->data = c;
		}
			
			
		else
		{
			insertChild(&((*tree)->rchild),c);		
		}
	}
}