路虽远行则必达,事虽难做则必成!!
二叉排序树查找算法代码
什么是二叉排序树:首先是一棵二叉树,或者为空,或者满足以下条件:
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;
}
分类: 算法