參考:Mark Allen Weiss 著《數據結構與算法分析——C語言描述》(第二版)算法
主要內容:二叉樹及二叉查找樹數據結構
1、二叉樹函數
1 二叉樹定義spa
二叉樹是一棵每一個節點都不能有多於兩個兒子的樹指針
2 實現code
2.1 實現思路blog
由於一個二叉樹最多有兩個兒子,因此咱們能夠用指針直接指向它們。遞歸
2.2 實現代碼it
typedef struct TreeNode *PtrToNode; typedef struct PtrToNode Tree; struct TreeNode { int Element; Tree Left; Tree Right; };
2、二叉查找樹
io
1 二叉查找樹的定義
二叉查找樹是一棵特殊的二叉樹。對於數中的每一個節點X,它的左子樹中全部關鍵字值小於X的關鍵字;
而它的右子樹中全部關鍵字值大於X的關鍵字。圖1中,只有左邊的二叉樹是二叉查找樹。由於右邊的樹在關鍵字爲6的節點的左子樹中有個節點的關鍵字爲7,大於6。
圖1 兩棵二叉樹
2 基本操做
函數聲明代碼
1 1 #ifndef BINARY_SEARCH_TREE_H_INCLUDED 2 2 #define BINARY_SEARCH_TREE_H_INCLUDED 3 3 #include <stdio.h> 4 4 #include <stdlib.h> 5 5 6 6 struct TreeNode; 7 7 typedef struct TreeNode *Position; 8 8 typedef struct TreeNode *SearchTree; 9 9 10 10 SearchTree MakeEmpty(SearchTree T); 11 11 Position Find(int X,SearchTree T); 12 12 Position FindMin(SearchTree T); 13 13 Position FindMax01(SearchTree T); 14 14 Position FindMax02(SearchTree T); 15 15 SearchTree Insert(int X,SearchTree T); 16 16 SearchTree Delete(int X,SearchTree T); 17 17 void Retrieve01(Position P); 18 18 int Retrieve(Position P); 19 19 #endif // BINARY_SEARCH_TREE_H_INCLUDED
2.1 初始化操做(MakeEmpty)
2.1.1 實現思路
建立一個空樹。
2.1.2 僞代碼
1 /*創建一棵空樹的例程*/ 2 SearchTree MakeEmpty(SearchTree T) 3 { 4 if(NULL != T) 5 { 6 MakeEmpty(T->Left); 7 MakeEmpty(T->Right); 8 free(T); 9 } 10 return NULL; 11 }
2.2 查找操做(Find)
2.2.1 實現思路見圖1。
圖2 Find實現思路
注意:通常返回指向樹T中具備關鍵字X的節點的指針,若是這樣的節點不存在則返回NULL
2.2.2 僞代碼
1 /*二叉查找樹獲得Find操做*/ 2 Position Find(int X,SearchTree T) 3 { 4 if(NULL == T) 5 { 6 return NULL; 7 } 8 if(X < T->Element) 9 { 10 Find( X,T->Left); 11 }else if(X > T->Element) 12 { 13 Find( X,T->Right); 14 }else{ 15 return T; 16 } 17 }
2.2.3 補充
由Find操做延伸出查找最小值操做(FindMin)和查找最大值操做(FindMax)。
(1)查找最小值操做(FindMin)
基本思路爲:從根開始而且只要有左兒子就對左子樹進行Find操做,返回值爲指向最小值節點的指針。實現代碼以下,
1 /*對二叉查找樹的FindMin的遞歸實現*/ 2 Position FindMin(SearchTree T) 3 { 4 if(NULL == T){ 5 return NULL;} 6 if(NULL == T->Left) 7 { 8 return T; 9 }else{ 10 return FindMin(T->Left); 11 } 12 }
(2)查找最小值操做(FindMax)
基本思路爲:從根開始而且只要有右兒子就對右子樹進行Find操做,返回值爲指向最大值節點的指針。實現代碼以下,
/*對二叉查找樹的FindMax的遞歸實現*/ Position FindMax01(SearchTree T) { if(NULL == T){ return NULL;} if(NULL == T->Right) { return T; }else{ return FindMin(T->Right); } } /*對二叉查找樹的FindMax的非遞歸實現*/ Position FindMax02(SearchTree T) { if(NULL != T){ while(T->Right != NULL) { T=T->Right; } } return T; }
2.3 插入操做(Insert)
2.3.1 實現思路如圖3
圖3 插入操做實現思路
2.3.2 實現代碼以下,
1 /*插入元素到二叉查找樹的例程*/ 2 SearchTree Insert(int X,SearchTree T) 3 { 4 if(NULL == T) 5 { 6 T = (struct TreeNode *)malloc(sizeof(struct TreeNode)); 7 if( T == NULL ) 8 { 9 perror("Out Of Space!!!"); 10 }else{ 11 T->Element = X; 12 T->Left = NULL; 13 T->Right = NULL; 14 } 15 }else if( X > T->Element) 16 { 17 T->Right = Insert( X,T->Right); 18 }else if( X < T->Element) 19 { 20 T->Left = Insert( X,T->Right); 21 } 22 return T; 23 }
2.4 刪除操做(Delete)
2.4.1 實現思路如圖4
圖4 刪除操做實現思路
2.4.2 實現代碼以下,
/*二叉查找樹的刪除例程*/ SearchTree Delete(int X,SearchTree T) { Position TmpCell; if(NULL == T) { perror("Element is not found"); }else if(X < T->Element) { T->Left = Delete(X,T->Left); }else if(X > T->Element) { T->Right = Delete(X,T->Right); }else{ if(T->Left && T->Right ) { TmpCell = FindMin(T->Right); T->Element = TmpCell->Element; T->Right =Delete(T->Element,T->Right); }else{ TmpCell = T; if(T->Left == NULL) { T =T->Right; }else if(T->Right == NULL) { T = T->Left; } } free(TmpCell); } return T; }