二叉樹的一個重要應用是它們在查找中的使用。spa
二叉查找樹的性質:對於樹中的每一個節點X,它的左子樹中全部項的值小於X中的項,而它的右子樹中全部項的值大於X中的項。這意味着該樹全部的元素能夠用某種一致的方式排序。code
二叉查找樹的平均深度是O(logN)。二叉查找樹要求全部的項都可以排序。樹中的兩項總能夠使用Comparable接口中的compareTo方法比較。排序
ADT的聲明:遞歸
struct TreeNode; typedef struct TreeNode *Position; typedef struct TreeNode *SearchTree; SearchTree MakeEmpty(SearchTree T); Position Find(ElementType X, SearchTree T); Position FindMax(SearchTree T); Position FindMin(SearchTree T); SearchTree Insert(ElementType X, SearchTree T); SearchTree Delete(ElementType X, SearchTree T); ElementType Retrieve(Position P); struct TreeNode{ ElementType Element; SearchTree Left; SearchTree Right; };
SearchTree MakeEmpty(SearchTree T){ if(T != NULL){ MakeEmpty(T->Left); MakeEmpty(T->Right); free(T); } return NULL; }
Position Find(ElementType X, SearchTree T){ if(T == NULL) return NULL; else if(X < T->Element) return Find(X, T->Left); else if(X > T->Element) return Find(X, T->Right); else return T; }
Position FindMin(SearchTree T){ if(T == NULL) return NULL; else if(T->Left == NULL) return T; else return FindMin(T->Left); } Position FindMax(SearchTree T){ if(T != NULL) while(T->Right != NULL) T = T->Right; return T; }
SearchTree Insert(ElementType X, SearchTree T){ if(T == NULL){ T = (SearchTree)malloc(sizeof(struct TreeNode)); T->Element = X; T->Left = T->Right = NULL; } else if(X < T->Element) T->Left = Insert(X, T->Left); else if(X > T->Element) T->Right = Insert(X, T->Right); // Else X is in the tree already, we'll do nothing! return T; }
SearchTree Delete(ElementType X, SearchTree T){ Position TmpCell; if(T == NULL) printf("Element Not Found\n"); 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(TmpCell->Element, T->Right); } else{ TmpCell = T; if(!(T->Left)) T = T->Right; else if(!(T->Right)) T = T->Left; free(TmpCell); } return T; }