以下是我的算法之后是Hackbuteer1的算法 Hack的算法更加好。
BiTree al=NULL,ar=NULL;
BiTree FindAnstorBST(BiTree T,BiTree a,BiTree b)
{
if(T)
{
if(T->value>a->value && T->value<b->value)
return T;
if(T->value<a->value && T->value<b->value)
{
al=FindAnstorBST(T->rChild,a,b);
}
if(T->value>a->value && T->value>b->value)
{
ar=FindAnstorBST(T->lChild,a,b);
}
if(al!=NULL)
return al;
if(ar!=NULL)
return ar;
return NULL;
}
return NULL;
}
BiTree find(BiTree root,BiTree a,BiTree b)
{
while(root)
{
if(root->value>a->value&&root->value<b->value)
return root;
else if(root->value>a->value && root->value>b->value)
root=root->lChild;
else if(root->value<a->value&& root->value<b->value)
root=root->rChild;
}
return NULL;
}
int main()
{
BiTree T=NULL;
int i;
while(scanf("%d",&i)!=EOF)
InsertBST(T,i);
InOrderTraverse(T);
cout<<endl;
//cout<<FindAnstorBST(T,T->lChild->lChild,T->rChild)->value<<endl;
cout<<find(T,T->lChild->lChild,T->rChild)->value<<endl;
return 0;
}
http://blog.csdn.net/Hackbuteer1/article/list/1
以下是用到的数据结构和一些插入节点的操作
typedef struct BiTNode
{
int value;
struct BiTNode *lChild,*rChild;
}*BiTree;
bool LT(int a,int b)
{
return a<b?true:false;
}
bool SearchBST(BiTree root,int data,BiTree f,BiTree& p)
{
if(!root)
{
p=f;
return false;
}
else if(data==root->value)
{
p=root;
return true;
}
else if(data<root->value)
{
return SearchBST(root->lChild,data,root,p);
}
else if(data>root->value)
return SearchBST(root->rChild,data,root,p);
}
void InsertBST(BiTree& root,int data)
{
BiTree p,s;
if(!SearchBST(root,data,NULL,p))
{
s=(struct BiTNode*)malloc(sizeof(BiTNode));
s->value=data;
s->lChild=s->rChild=NULL;
if(p==NULL)
root=s;
else if(LT(data,p->value))
{
p->lChild=s;
}
else
p->rChild=s;
}
return;
}
void PreOrderTraverse(BiTree root)
{
if(root)
{
cout<<root->value<<" ";
PreOrderTraverse(root->lChild);
PreOrderTraverse(root->rChild);
}
}
void InOrderTraverse(BiTree root)
{
if(root)
{
InOrderTraverse(root->lChild);
cout<<root->value<<" ";
InOrderTraverse(root->rChild);
}
}
void PostOrderTraverse(BiTree root)
{
if(root)
{
PostOrderTraverse(root->lChild);
PostOrderTraverse(root->rChild);
cout<<root->value<<" ";
}
}
void DeleteBST(BiTree root)
{
if(root)
{
DeleteBST(root->lChild);
DeleteBST(root->rChild);
free(root);
}
}
void Delete(BiTree &p)
{
//从二叉树排序树中删除节点p,并且重新连接他的左或右子树
BiTree q;
BiTree s;
if(!p->rChild)//节点的右子树为空 只需要连接他的左子树
{
q=p;
p=p->lChild;
delete q;
}
else if(!p->lChild)//左子树为空 只需要连接他的右子树即可
{
q=p;
p=p->rChild;
delete q;
}
else//左右子树都不空
{
q=p;
s=p->lChild;
while(s->rChild)//找到左边的子树的最右边节点
{
q=s;//q指向最右边节点的父节点
s=s->rChild;
}
p->value=s->value;//用删除节点的前驱来代替他
if(q!=p)
{
q->rChild=s->lChild;//连接s的左子树
}
else
q->lChild=s->lChild;//连接s的左子树
delete s;
}
return;
}
void DeleteBSTKey(BiTree &T,int key)
{
///若二叉排序树中存在Key,则删除之
if(!T)
return;
else
{
if(key==T->value)
{
return Delete(T);
}
}
if(key<T->value)
return DeleteBSTKey(T->lChild,key);
else
return DeleteBSTKey(T->rChild,key);
}