資料結構---04-樹7 二叉搜尋樹的操作集(30 分)
阿新 • • 發佈:2019-01-01
#include<cstdio> #include<cstdlib> #include<iostream> using namespace std; typedef int ElementType; typedef struct TNode* Position; typedef Position BinTree; struct TNode{ ElementType Data; BinTree Left; BinTree Right; }; 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); void PreorderTravesal(BinTree BT){// 前序遍歷 (格式寫法一) if(!BT) return ; printf(" %d",BT->Data); PreorderTravesal(BT->Left); PreorderTravesal(BT->Right); } void InorderTraversal(BinTree BT){//中順遍歷 if (!BT) return; PreorderTravesal(BT->Left); printf(" %d", BT->Data); PreorderTravesal(BT->Right); } void InorderTravesal(BinTree BT){//後續遍歷 (格式寫法二) if(BT){ InorderTravesal(BT->Left); printf(" %d",BT->Data); InorderTravesal(BT->Right);} } int main() { BinTree BST,MinP,MaxP,Tmp; ElementType X; int N,i; BST=NULL; cin>>N; for(i=0;i<N;i++){ cin>>X; BST=Insert(BST,X); } printf("Preorder:"); PreorderTravesal(BST);printf("\n"); MinP=FindMin(BST); MaxP=FindMax(BST); cin>>N; for(i=0;i<N;i++){ cin>>X; Tmp=Find(BST,X); if(Tmp==NULL) printf("%d id 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); } } cin>>N; for(i=0;i<N;i++){ cin>>X; BST=Delete(BST,X); } printf("Inorder:"); InorderTravesal(BST); printf("\n"); return 0; } BinTree Insert(BinTree BST,ElementType X){ //構建樹,每次構建,(原則:大於父截點的放在左邊,小於父截點的放在右邊。),便於查詢 if(!BST){ BST=(BinTree)malloc(sizeof(struct TNode)); //BST=new struct TNode; BST->Data=X; BST->Left=NULL; 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); return BST; } BinTree Delete(BinTree BST,ElementType X){//刪除元素 Position Tmp; if(!BST) printf("Not Found\n"); 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=FindMax(BST->Left); BST->Data=Tmp->Data; BST->Left=Delete(BST->Left,Tmp->Data); } else{ Tmp=BST; if(!BST->Left) BST=BST->Right; else BST=BST->Left; free(Tmp); } } return BST; } Position Find(BinTree BST,ElementType X){//查詢某一元素 while(BST&&(X!=BST->Data)){ if(X<BST->Data) BST=BST->Left; else BST=BST->Right; } return BST; } Position FindMin(BinTree BST){ if(BST){ while(BST->Left) BST=BST->Left; } return BST; } Position FindMax(BinTree BST){ if(BST){ while(BST->Right) BST=BST->Right; } return BST; }