04-樹7 二叉搜尋樹的操作集
阿新 • • 發佈:2019-02-09
二叉搜尋樹的各種操作!
程式碼:
#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; } void PreorderTraversal( BinTree BT ){ /* 先序遍歷,由裁判實現,細節不表 */ printf(" %d",BT->Data); if(BT->Left) PreorderTraversal(BT->Left); if(BT->Right) PreorderTraversal(BT->Right); } void InorderTraversal( BinTree BT ){ /* 中序遍歷,由裁判實現,細節不表 */ if(BT->Left) PreorderTraversal(BT->Left); printf(" %d",BT->Data); if(BT->Right) PreorderTraversal(BT->Right); } BinTree Insert( BinTree BST, ElementType X ){//插入 if(!BST){//到達插入點,即葉子節點的左或右 BST = (BinTree)malloc(sizeof(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 ){ BinTree 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 = 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; free(Tmp);//釋放刪除結點空間 } return BST;//返回結點 } Position Find( BinTree BST, ElementType X ){ if(!BST) return NULL; if(BST->Data == X) return BST; if(X < BST->Data) return Find(BST->Left,X); else return Find(BST->Right,X); } Position FindMin( BinTree BST ){ if(!BST) return NULL;//空樹 if(!BST->Left) return BST;//找到最左邊值並返回 return FindMin(BST->Left); //繼續向左尋找 } Position FindMax( BinTree BST ){ /*if(!BST) return NULL;//空樹 if(!BST->Right) return BST;//找到 return FindMax(BST->Right); */ if(BST) while(BST->Right) BST = BST->Right; return BST; }