二叉查找树(Binary Search Tree)又称二叉排序树(Binary Sort Tree)或者二叉搜索树,定义如下:
二叉查找树或者是一棵空树,或者是具有下列性质的二叉树(一个结点不能多余两个儿子):
(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
如下图所示,便是一颗二叉查找树:
二叉查找树的基本操作有寻找最大值,最小值,查找指定的值,插入元素,删除元素等等,均可以用递归的方法实现,具体代码如下:
#include <iostream> using namespace std; typedef struct TreeNode *SearchTree; typedef struct TreeNode *Position; struct TreeNode { int Element; SearchTree Left; SearchTree Right; }; //////////////函数声明////////////////////////// void MakeEmpty (SearchTree T); //清空一个树 SearchTree CreatTree (int x); //创建一个根为x的空树 Position Find(int x, SearchTree T); //查找函数 Position FindMin(SearchTree T); //寻找二叉树的最小值 Position FindMax(SearchTree T); //寻找二叉树的最大值 SearchTree Insert(int x, SearchTree T); //插入元素 SearchTree Delete(int x, SearchTree T); //删除元素 //////////////函数定义////////////////////////// void MakeEmpty (SearchTree T) { if (T != NULL) { MakeEmpty(T->Left); MakeEmpty(T->Right); delete T;// free(T); } } SearchTree CreatTree (int x) { SearchTree T; T = static_cast<SearchTree>(malloc(sizeof(struct TreeNode))); T->Element = x; T->Left = NULL; T->Right = NULL; return T; } Position Find(int x, SearchTree T) { if(T == NULL) { return NULL; } 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(int x, SearchTree T) { if(T == NULL) { T = static_cast<SearchTree>(malloc(sizeof(struct TreeNode))); if(T == NULL) { cout << "out of space" << endl; } else { T->Element = x; T->Left = NULL; 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); } } } return T; } SearchTree Delete(int x, SearchTree T) { Position TmpCell; if (T == NULL) { cout << "Element not found" << endl; } 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; } int main () { //////////////测试////////////////////// SearchTree Tree_1 = CreatTree(6); Tree_1 = Insert(2,Tree_1); Tree_1 = Insert(8,Tree_1); Tree_1 = Insert(1,Tree_1); Tree_1 = Insert(4,Tree_1); Tree_1 = Insert(3,Tree_1); /*///////////////上面的二叉树为//////////////////////////// 6 / 2 8 / 1 4 / 3 ///////////////////////////////////////////////////////*/ cout << FindMax(Tree_1)->Element << endl; cout << FindMin(Tree_1)->Element << endl; cout << Find(2,Tree_1)->Right->Element << endl; MakeEmpty (Tree_1); return 0; }
上面的函数多用递归实现,好好分析这些函数有利于理解递归的含义。
夜深了,我该怎么办?