数据结构之二叉树查找
数据结构之--二叉树查找
定义:它是一棵树,或者具有以下性质的树。
若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
它的左、右子树也分别为二叉排序树;
图解:
#include<stdio.h>
#include<stdlib.h>
typedef int Status;
#define TRUE 1
#define FALSE 0
typedef struct BiTNode{ /*节点结构*/
int data;
struct BiTNode *lchild,*rchild; /*节点数据*/
}BiTNode,*BiTree; /*左右孩子指针*/
/*中序遍历二叉树*/
void InOrderTraverse(BiTree T){
if(T==NULL)
return;
InOrderTraverse(T->lchild);
printf("%d ",T->data);
InOrderTraverse(T->rchild);
}
/*二叉树查找*/
Status SearchBST(BiTree T,int key,BiTree f,BiTree *p){
if(!T){ /*查找不成功*/
*p = f;
return FALSE;
}
else if(key==T->data){ /*查找成功*/
*p = T;
return TRUE;
}
else if(key<T->data)
return SearchBST(T->lchild,key,T,p); /*在左子树继续查找*/
else
return SearchBST(T->rchild,key,T,p); /*在右子树继续查找*/
}
/*递归二叉树查找key,查到时删除*/
Status DeleteBST(BiTree *T,int key){
if(!*T) /*不存在关键字等于key的数据元素*/
return FALSE;
else{
if(key==(*T)->data) /*找到关键字等于key的数据元素*/
return Delete(T);
else if(key<(*T)->data)
return DeleteBST(&(*T)->lchild,key);
else
return DeleteBST(&(*T)->rchild,key);
}
}
/*在二叉树上按左边小右边大的方式插入*/
Status InsertBST(BiTree *T,int key){
BiTree p,s;
if(!SearchBST(*T,key,NULL,&p)){ /*查找不成功*/
s = (BiTree)malloc(sizeof(BiTNode));
s->data = key;
s->lchild = s->rchild=NULL;
if(!p)
*T = s; /*插入s为新的根节点*/
else if(key<p->data)
p->lchild=s; /*插入s为左孩子*/
else
p->rchild=s; /*插入s为右孩子*/
return TRUE;
}
else
return FALSE; /*树中已有关键字相同的节点,不再插入*/
};
void main(){
int i;
int num[] = {62,88,58,47,35,73,51,99,37,93};
BiTree T=NULL;
for(i=0;i<10;i++){ /*链表初始化数据*/
InsertBST(&T,num[i]);
}
printf("中序遍历结果:");
InOrderTraverse(T); /*中序遍历二叉树*/
printf("\n查找结果:");
BiTree p;
if(SearchBST(T,93,NULL,&p)){ /*查找93*/
printf("%d\n",p->data); /*输出查找到的结果*/
}
DeleteBST(&T,47);
printf("删除47节点后的中序遍历结果:");
InOrderTraverse(T);
printf("\n");
};
运行结果: