二叉搜索树
查找分为静态查找和动态查找。静态查找可以使用二分查找方式。
若一搜索树(查找树)是一个有n个结点的完全二叉树,则该树的最大值一定在叶结点上
错误
若一搜索树(查找树)是一个有n个结点的完全二叉树,则该树的最小值一定在叶结点上
正确
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct TreeNode *BinTree;
typedef BinTree Position;
typedef struct TreeNode
{
ElementType Data;
BinTree Left;
BinTree Right;
}*LPNODE;
BinTree Insert(ElementType X,BinTree BST)
{
if(!BST)
{
/*若原树为空,生成并返回一个结点的二叉搜索树*/
BST = (BinTree)malloc(sizeof(struct TreeNode));
BST->Data = X;
BST->Left = NULL;
BST->Right = NULL;
}
else /*开始找要插入元素的位置*/
{
if(BST->Data < X)
BST->Right = Insert(X,BST->Right);
else if(BST->Data > X)
BST->Left = Insert(X,BST->Left);
/*else X已经存在,什么都不做 */
}
return BST;
}
/*尾递归方式查找*/
ElementType Find(ElementType X,BinTree BST)
{
if(!BST)
return NULL;
if(BST->Data < X)
return Find(X,BST->Right);
else if(BST->Data > X)
return Find(X,BST->Left);
else /*X == BST->Data*/
return BST; /*查找成功,返回找到结点的地址*/
}
/*迭代、非递归方式*/
Position FindMax(BinTree BST)
{
if(BST)
while(BST->Right)
BST = BST->Right;
return BST;
}
Position FindMin(BinTree BST)
{
if(!BST)
return NULL;
else if(!BST->Left) /*有根结点,但没有左子树,直接返回根*/
return BST;
else
return FindMin(BST->Left);
}
BinTree Delete(ElementType X,BinTree BST)
{
Position Tmp;
if(!BST)
printf("找不到要删除的元素!\n");
else if(X < BST->Data)
BST->Left = Delete(X,BST->Left);
else if(X > BST->Data)
BST->Right = Delete(X,BST->Right);
else
{
if(BST->Left && BST->Right)
{
Tmp = FindMin(BST->Right);
BST->Data = Tmp->Data;
BST->Right = Delete(BST->Data,BST->Right);
}
else
{
Tmp = BST;
if(!BST->Left)
BST = BST->Right;
else if(!BST->Right)
BST = BST->Left;
free(Tmp);
}
}
return BST;
}
void PreOrderTraversalByStack(BinTree BST)
{
if(!BST)
return;
BinTree pMove = BST;
BinTree stack[100];
int stackTop = -1;
while(pMove || stackTop != -1 )
{
while(pMove)
{
printf("%d ",pMove->Data);
stack[++stackTop] = pMove;
pMove = pMove->Left;
}
if(stackTop != -1)
{
pMove = stack[stackTop--];
pMove = pMove->Right;
while(pMove)
{
printf("%d ",pMove->Data);
stack[++stackTop] = pMove;
pMove = pMove->Left;
}
}
}
}
void InOrderTraversalByStack(BinTree BST)
{
if(!BST)
return;
BinTree pMove = BST;
BinTree stack[100];
int stackTop = -1;
while(pMove || stackTop != -1 )
{
while(pMove)
{
stack[++stackTop] = pMove;
pMove = pMove->Left;
}
if(stackTop != -1)
{
pMove = stack[stackTop--];
printf("%d ",pMove->Data);
pMove = pMove->Right;
while(pMove)
{
stack[++stackTop] = pMove;
pMove = pMove->Left;
}
}
}
}
void LevelTraversal(BinTree BT)
{
LPNODE pMove = BT;
LPNODE queue[100];
int front = 0;
int tail = 0;
queue[tail++] = pMove;
printf("%d ",pMove->Data);
while(front != tail)
{
pMove = queue[front++];
if(pMove->Left != NULL)
{
queue[tail++] = pMove->Left;
printf("%d ",pMove->Left->Data);
}
if(pMove->Right != NULL)
{
queue[tail++] = pMove->Right;
printf("%d ",pMove->Right->Data);
}
}
}
int main()
{
BinTree BST = NULL;
BST = Insert(5,BST);
BST = Insert(3,BST);
BST = Insert(4,BST);
BST = Insert(9,BST);
BST = Insert(20,BST);
BST = Insert(30,BST);
BST = Insert(40,BST);
BST = Insert(43,BST);
BST = Insert(34,BST);
BST = Insert(6,BST);
BST = Insert(7,BST);
BST = Insert(8,BST);
LevelTraversal(BST);
printf("\n%d",FindMax(BST)->Data);
printf("\n%d",FindMin(BST)->Data);
BST = Delete(43,BST);
BST = Delete(3,BST);
printf("\n");
LevelTraversal(BST);
printf("\n%d",FindMax(BST)->Data);
printf("\n%d",FindMin(BST)->Data);
BinTree Tmp = Find(100,BST);
if(!Tmp)
printf("\nNULL\n");
else
printf("\n%d\n",Find(100,BST));
//printf("\n%d\n",Tmp->Data);
return 0;
}
5 3 9 4 6 20 7 30 8 40 34 43
43
3
5 4 9 6 20 7 30 8 40 34
40
4
NULL