#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct BSTNode{
ElemType elem;
struct BSTNode *lchild,*rchild;
}BSTNode,*BiTree;
//非递归的创建二叉查找树
int BST_Insert(BiTree &T,ElemType e){
BiTree TreeNew=(BiTree)calloc(1,sizeof(BSTNode));//新结点申请空间
TreeNew->elem=e;//把值放入
if(NULL==T){//树为空,新结点作为树的根
T=TreeNew;
return 0;
}
BiTree p=T,parent;//p用来查找树
while (p){
parent=p;
if(e>p->elem){
p=p->rchild;
}
else if(e<p->elem){
p=p->lchild;
}
else{
return -1;//相等的元素不可以放入查找树,考研不会考
}
}
if(e<parent->elem){
parent->lchild=TreeNew;
}
else{
parent->rchild=TreeNew;
}
return 0;
}
//使用递归创建二叉查找树
//int BST_Insert(BiTree &T,ElemType e){
// if(NULL==T){
// //为新结点申请空间,第一个结点作为树根,后面递归再进入的不是树根,是为叶子结点
// T=(BiTree) malloc(sizeof(BSTNode));
// T->elem=e;
// T->lchild=T->rchild=NULL;
// return 1;//代表插入成功
// }
// else if(e==T->elem){
// return 0;//发现相同元素,不插入
// }
// else if(e<T->elem){
// return BST_Insert(T->lchild,e);
// }
// else{
// return BST_Insert(T->rchild,e);
// }
//}
void Creat_BSTree(BiTree &T,ElemType* str,int len){
for (int i=0;i<len;i++) {
BST_Insert(T,str[i]);
}
}
void InorderTree(BiTree T) {
if(T!=NULL){
InorderTree(T->lchild);
printf("%3d",T->elem);
InorderTree(T->rchild);
}
}
BiTree BST_Search(BiTree T,ElemType elem,BiTree &parent){
parent=NULL;
while(T!=NULL&&elem!=T->elem){
parent=T;
if(elem<T->elem){
T=T->lchild;
}
else{
T=T->rchild;
}
return T;
}
}
int main() {
BiTree T=NULL;//树根
BiTree parent;
BiTree search;
ElemType str[7]={54,20,66,40,28,79,58};//将要进入二叉排序树的元素值
Creat_BSTree(T,str,7);
InorderTree(T);//中序遍历二叉查找树是由小到大的
search=BST_Search(T,40,parent);
if(search){
printf("\n%d\n",search->elem);
}
else{
printf("false");
}
return 0;
}