什么是二叉排序樹:首先是一棵二叉樹,或者為空,或者滿足以下條件:
1,左子樹不空,所有左子樹值都小於根節點;
2,右子樹不空,所有右子樹值都大於根節點;
3,根節點的左右子樹也是二叉排序樹。
二叉排序樹(二叉鏈表),中序遍歷二叉排序樹即可變成有序數列。(無序數列通過構建二叉排序樹成有序序列)
寫一個二叉排序樹的類,里面應該有成員函數:獲取根結點;中序遍歷;遞歸查找;迭代查找;插入元素;最大值;最小值;查找前驅結點;查找后繼結點;用結點 nodeM 替換結點 nodeN;刪除結點是key的元素等等。
一般對二叉排序樹的操作:創建;插入(遞歸);刪除;搜索(遞歸)。
代碼:
#include <iostream> using namespace std; typedef struct BSTNode { int data; struct BSTNode *lTree,*rTree; }BSTNode,*BSTree; //遞歸實現二叉排序樹的插入操作 void InsertBST(BSTree &BT,BSTNode *BN) { if(BT==NULL) BT=BN; else if(BT->data > BN->data) InsertBST(BT->lTree,BN); else InsertBST(BT->rTree,BN); } //刪除操作 //判斷它屬於哪種類型 //1、葉子節點。 //2、只有左子樹或者只有右子樹。 //3、既有左子樹,又有右子樹。 bool deleteBST(BSTree &BT,BSTNode *BN) { BSTNode* tmp; if(BN->lTree == NULL && BN->rTree == NULL) delete BN; else if(BN->lTree == NULL) { tmp=BN; BN=BN->rTree; delete tmp; } else if(BN->rTree == NULL) { tmp=BN; BN=BN->lTree; delete tmp; } else { tmp=BN; BSTNode * s = BN->lTree; while (s->rTree) { tmp = s; s = s->rTree; } BN->data = s->data; if (tmp != BN) { tmp->rTree = s->lTree; } else { tmp->lTree = s->lTree; } delete s; } return true; } //創建二叉排序樹 void CreateBST(BSTree &BT,int n) { BT=NULL;//這里一定要將BT置空,表示剛開始的時候是空樹,不置空的話,編譯器分配的BT是非空的 int i,j; int r[100]; BSTNode *s; for(j=0;j<n;j++) cin>>r[j]; for(i=0;i<n;i++) { s=new BSTNode; s->data=r[i]; s->lTree=NULL; s->rTree=NULL; InsertBST(BT,s); } } //遞歸實現搜索查找 BSTNode* searchBST(BSTree &BT,int value) { if(BT==NULL) return NULL; if(BT->data==value) return BT; if(BT->data>value) return searchBST(BT->lTree,value); if(BT->data<value) return searchBST(BT->rTree,value); } int main() { BSTree bt; BSTNode * bn; CreateBST(bt,20); searchBST(bt,16); return 0; }