首页 > 6-12 二叉搜索树的操作集

6-12 二叉搜索树的操作集

6-12 二叉搜索树的操作集(30 分)

本题要求实现给定二叉搜索树的5种常用操作。

函数接口定义:

BinTree Insert( BinTree BST, ElementType X );
BinTree Delete( BinTree BST, ElementType X );
Position Find( BinTree BST, ElementType X );
Position FindMin( BinTree BST );
Position FindMax( BinTree BST );

其中BinTree结构定义如下:

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{ElementType Data;BinTree Left;BinTree Right;
};
  • 函数InsertX插入二叉搜索树BST并返回结果树的根结点指针;
  • 函数DeleteX从二叉搜索树BST中删除,并返回结果树的根结点指针;如果X不在树中,则打印一行Not Found并返回原树的根结点指针;
  • 函数Find在二叉搜索树BST中找到X,返回该结点的指针;如果找不到则返回空指针;
  • 函数FindMin返回二叉搜索树BST中最小元结点的指针;
  • 函数FindMax返回二叉搜索树BST中最大元结点的指针。

裁判测试程序样例:

#include 
#include typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{ElementType Data;BinTree Left;BinTree Right;
};void PreorderTraversal( BinTree BT ); /* 先序遍历,由裁判实现,细节不表 */
void InorderTraversal( BinTree BT );  /* 中序遍历,由裁判实现,细节不表 */BinTree Insert( BinTree BST, ElementType X );
BinTree Delete( BinTree BST, ElementType X );
Position Find( BinTree BST, ElementType X );
Position FindMin( BinTree BST );
Position FindMax( BinTree BST );int main()
{BinTree BST, MinP, MaxP, Tmp;ElementType X;int N, i;BST = NULL;scanf("%d", &N);for ( i=0; iData);if (Tmp==MinP) printf("%d is the smallest key
", Tmp->Data);if (Tmp==MaxP) printf("%d is the largest key
", Tmp->Data);}}scanf("%d", &N);for( i=0; i

输入样例:

10
5 8 6 2 4 1 0 10 9 7
5
6 3 10 0 5
5
5 7 0 10 3

输出样例:

Preorder: 5 2 1 0 4 8 6 7 10 9
6 is found
3 is not found
10 is found
10 is the largest key
0 is found
0 is the smallest key
5 is found
Not Found
Inorder: 1 2 4 6 8 9


思路:二叉搜索树忘了?,看完之后曾国强不想用递归。

BinTree Insert(BinTree BST, ElementType X)
{if (BST == NULL){BST = (BinTree)malloc(sizeof(struct TNode));BST->Data = X;BST->Left = NULL;BST->Right = NULL;return BST;}BinTree bin = BST;while (bin){if (X < bin->Data){if (bin->Left == NULL){bin->Left = (BinTree)malloc(sizeof(struct TNode));bin->Left->Data = X;bin->Left->Left = NULL;bin->Left->Right = NULL;break;}else bin = bin->Left;}else if (bin->Data < X) {if (bin->Right == NULL){bin->Right = (BinTree)malloc(sizeof(struct TNode));bin->Right->Data = X;bin->Right->Left = NULL;bin->Right->Right = NULL;break;}else bin = bin->Right; }}return BST;
}
BinTree Delete(BinTree BST, ElementType X)
{if (!BST) printf("Not Found
");else{if (X < BST->Data)BST->Left = Delete(BST->Left, X);else if (X>BST->Data)BST->Right = Delete(BST->Right, X);else{if (BST->Left&&BST->Right){Position pos = FindMin(BST->Right);BST->Data = pos->Data;BST->Right = Delete(BST->Right, BST->Data);}else if (!BST->Left){Position pos = BST;BST = BST->Right;free(pos);}else if (!BST->Right){Position pos = BST;BST = BST->Left;free(pos);}}}return BST;
}
Position Find(BinTree BST, ElementType X)
{if (!BST)return BST;Position pos = BST;while (pos){if (pos->Data == X)return pos;if (pos->Data > X){if (pos->Left == NULL)return pos->Left;else pos = pos->Left;}if (pos->Data < X){if (pos->Right == NULL)return pos->Right;else pos = pos->Right;}}
}
Position FindMin(BinTree BST)
{if (!BST)return BST;Position pos = BST;while (pos->Left)pos = pos->Left;return pos;
}
Position FindMax(BinTree BST)
{if (!BST)return BST;Position pos = BST;while (pos->Right)pos = pos->Right;return pos;
}

 

 

转载于:https://www.cnblogs.com/zengguoqiang/p/8401272.html

更多相关: