#include<bits/stdc++.h> #define MaxSize 100 using namespace std; typedef struct TreeNode {//定義二叉樹結構 char Data; struct Node *lchild,*rchild; }*BiTree,BiTNode; //查找1 BiTNode Find( int X, BiTree BST ) { if( !BST ) return NULL; /*查找失敗*/ if( X > BST->Data ) return Find( X, BST->rchild ); /*在右子樹中繼續查找*/ else if( X < BST->Data ) return Find( X, BST->lchild ); /*在左子樹中繼續查找*/ else /* X == BST->Data */ return BST; /*查找成功,返回結點的找到結點的地址*/ } //查找2(非遞歸) BiTNode IterFind( int X, BiTree BST ) { while( BST ) { if( X > BST->Data ) BST = BST->rchild; /*向右子樹中移動,繼續查找*/ else if( X < BST->Data ) BST = BST->lchild; /*向左子樹中移動,繼續查找*/ else /* X == BST->Data */ return BST; /*查找成功,返回結點的找到結點的地址*/ } return NULL; /*查找失敗*/ } //查最小(遞歸) BiTNode FindMin(BiTree BST){ if(!BST) return NULL; else if(!BST->lchild) return BST; else return FindMin(BST->lchild); } //查最大(迭代) BiTNode FindMax(BiTree BST){ if(BST) while(BST->rchild) BST = BST->rchild; return BST; } //插入 BiTree Insert( int X, BiTree BST ) { if( !BST ){ /*若原樹為空,生成並返回一個結點的二叉搜索樹*/ BST = malloc(sizeof(struct TreeNode)); BST->Data = X; BST->lchild = BST->rchild = NULL; }else /*開始找要插入元素的位置*/ if( X < BST->Data ) BST->lchild = Insert( X, BST->lchild); /*遞歸插入左子樹*/ else if( X > BST->Data ) BST->rchild = Insert( X, BST->rchild); /*遞歸插入右子樹*/ /* else X已經存在,什么都不做 */ return BST; } //刪除 BiTree Delete( int X, BiTree BST ) { BiTNode Tmp; if( !BST ) printf("要刪除的元素未找到"); else if( X < BST->Data ) BST->lchild = Delete( X, BST->lchild); /* 左子樹遞歸刪除 */ else if( X > BST->Data ) BST->rchild = Delete( X, BST->rchild); /* 右子樹遞歸刪除 */ else /*找到要刪除的結點 */ if( BST->lchild && BST->rchild ) { /*被刪除結點有左右兩個子結點 */ Tmp = FindMin( BST->rchild ); /*在右子樹中找最小的元素填充刪除結點*/ BST->Data = Tmp->Data; BST->rchild = Delete( BST->Data, BST->rchild); /*在刪除結點的右子樹中刪除最小元素*/ } else { /*被刪除結點有一個或無子結點*/ Tmp = BST; if( !BST->lchild ) /* 有右孩子或無子結點*/ BST = BST->rchild; else if( !BST->rchild ) /*有左孩子或無子結點*/ BST = BST->lchild; free( Tmp ); } return BST; }