二叉查找树(Binary Search Tree),(又二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
二叉排序树结构定义
1 typedef int ElementType; 2 typedef struct TNode *Position; 3 typedef Position BinTree; 4 struct TNode 5 { 6 ElementType Data; 7 BinTree Left; 8 BinTree Right; 9 };
1、二叉排序树插入操作
1 BinTree Insert( BinTree BST, ElementType X ) 2 { 3 //将X插入二叉搜索树BST并返回结果树的根结点指针 4 if(!BST) 5 { 6 BST = (BinTree)malloc(sizeof(struct TNode)); 7 BST ->Data = X; 8 BST ->Left = BST ->Right = NULL; 9 } 10 else 11 { 12 if(X < BST ->Data ) 13 { 14 BST ->Left = Insert(BST ->Left, X); 15 } 16 else if(X > BST ->Data ) 17 { 18 BST ->Right = Insert(BST ->Right, X); 19 } 20 21 } 22 return BST; 23 24 }
2、二叉排序树删除操作(这个好像比较难唉)
1 BinTree Delete( BinTree BST, ElementType X ) 2 { 3 /*将X从二叉搜索树BST中删除,并返回结果树的根结点指针; 4 如果X不在树中,则打印一行Not Found并返回原树的根结点指针*/ 5 Position Tmp; 6 if(!BST) printf("Not Found "); 7 else 8 { 9 if( X < BST->Data) 10 BST ->Left = Delete(BST->Left, X); /* 左子树递归删除 */ 11 else if(X > BST->Data ) 12 BST ->Right = Delete(BST->Right, X); /* 右子树递归删除*/ 13 else /* 找到需要删除的结点 */ 14 { 15 if(BST->Left && BST->Right) /* 被删除的结点有左右子结点 */ 16 { 17 Tmp=FindMin(BST->Right); /* 在右子树中找到最小结点填充删除结点 */ 18 BST->Data = Tmp ->Data; 19 BST->Right=Delete(BST->Right,BST->Data);/* 递归删除要删除结点的右子树中最小元素 */ 20 } 21 else /* 被删除结点有一个或没有子结点*/ 22 { 23 Tmp = BST; 24 if(!BST->Left) BST = BST->Right; /*有右孩子或者没孩子*/ 25 else if(!BST->Right) BST = BST->Left;/*有左孩子,一定要加else,不然BST可能是NULL,会段错误*/ 26 free(Tmp); /*如无左右孩子直接删除*/ 27 } 28 } 29 } 30 return BST; 31 }
3、二叉树排序查找操作
1 Position Find( BinTree BST, ElementType X ) 2 { 3 //在二叉搜索树BST中找到X,返回该结点的指针;如果找不到则返回空指针; 4 if( !BST ) 5 { 6 return NULL; 7 } 8 else if( BST->Data==X ) 9 { 10 return BST; 11 } 12 else if( X < BST->Data) 13 { 14 return Find( BST->Left,X); 15 } 16 else 17 { 18 return Find( BST->Right,X); 19 } 20 }
4、最小结点
1 Position FindMin( BinTree BST ) 2 { 3 //返回二叉搜索树BST中最小元结点的指针; 4 if(BST) 5 { 6 while( BST->Left ) 7 { 8 BST = BST->Left; 9 } 10 } 11 return BST; 12 }
5、最大结点
1 Position FindMax( BinTree BST ) 2 { 3 //返回二叉搜索树BST中最大元结点的指针 4 if(BST) 5 { 6 while( BST->Right ) 7 { 8 BST = BST->Right; 9 } 10 } 11 return BST; 12 }