什么是二叉排序树:首先是一棵二叉树,或者为空,或者满足以下条件:
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; }