题目链接:点击打开链接
题目大意:略。
解题思路:二叉搜索树操作集。
AC 代码
#include <stdio.h> #include <stdlib.h> 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; i<N; i++ ) { scanf("%d", &X); BST = Insert(BST, X); } printf("Preorder:"); PreorderTraversal(BST); printf("\n"); MinP = FindMin(BST); MaxP = FindMax(BST); scanf("%d", &N); for( i=0; i<N; i++ ) { scanf("%d", &X); Tmp = Find(BST, X); if (Tmp == NULL) printf("%d is not found\n", X); else { printf("%d is found\n", Tmp->Data); if (Tmp==MinP) printf("%d is the smallest key\n", Tmp->Data); if (Tmp==MaxP) printf("%d is the largest key\n", Tmp->Data); } } scanf("%d", &N); for( i=0; i<N; i++ ) { scanf("%d", &X); BST = Delete(BST, X); } printf("Inorder:"); InorderTraversal(BST); printf("\n"); return 0; } /* 你的代码将被嵌在这里 */ /* 函数Insert将X插入二叉搜索树BST并返回结果树的根结点指针 */ BinTree Insert( BinTree BST, ElementType X ) { if(!BST) // 若原树为空,生成并返回一个结点的二叉搜索树 { BST=(BinTree)malloc(sizeof(struct TNode)); BST->Data=X; BST->Left=BST->Right=NULL; } else // 寻找要插入的位置 { if(X<BST->Data) BST->Left=Insert(BST->Left,X); else if(X>BST->Data) BST->Right=Insert(BST->Right,X); // else X 已经存在,无需操作 } return BST; } /* 函数Delete将X从二叉搜索树BST中删除,并返回结果树的根结点指针;如果X不在树中,则打印一行Not Found并返回原树的根结点指针 */ BinTree Delete( BinTree BST, ElementType X ) { Position tmp; if(!BST) puts("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) // 被删除的结点有左、右子结点 { tmp=FindMin(BST->Right); // 在右子树种找到最小结点填充删除结点 BST->Data=tmp->Data; BST->Right=Delete(BST->Right,BST->Data); // 递归删除要删除结点的右子树种最小元素 } else // 被删除结点有一个或没有子结点 { tmp=BST; if(!BST->Left) BST=BST->Right; // 有右孩子或者没孩子 else if(!BST->Right) BST=BST->Left; // 只有左孩子。客观上也可以说没有孩子的情况,只是上面 if 优先会判断没有孩子的情况,所以这里就不再认定为具备“没有孩子的情况” free(tmp); } } } return BST; } /* 函数Find在二叉搜索树BST中找到X,返回该结点的指针;如果找不到则返回空指针 */ Position Find( BinTree BST, ElementType X ) { if(!BST) return NULL; if(BST->Data==X) return BST; if(X>BST->Data) return Find(BST->Right,X); if(X<BST->Data) return Find(BST->Left,X); } /* 函数FindMin返回二叉搜索树BST中最小元结点的指针 */ Position FindMin( BinTree BST ) { if(BST) while(BST->Left) BST=BST->Left; return BST; } /* 函数FindMax返回二叉搜索树BST中最大元结点的指针 */ Position FindMax( BinTree BST ) { if(BST) while(BST->Right) BST=BST->Right; return BST; }