/*查找二叉树简要实现
*
*
*/
#include <stdio.h>
#include <stdlib.h>
struct TreeNode;
typedef int ElementType;
typedef struct TreeNode* PtrToNode;
typedef PtrToNode Tree;
typedef PtrToNode Position;
struct TreeNode{
ElementType data;
Tree LChild;
Tree RChild;
};
Tree CreateBiTree();/*创建一颗树*/
Tree Insert(ElementType X, Tree T);/*插入二叉树*/
Tree Delete(ElementType X, Tree T);/*删除某结点*/
Position FindElement(ElementType X, Tree T);/*查找某元素*/
Position FindMin(Tree T);/*查找最小元素*/
Position FindMax(Tree T);/*查找最大元素*/
void Disptree(Tree T);/*凹入表示法输出二叉树* /
void PreOrderTraverse(Tree T);/*前序遍历二叉树*/
void InOrderTraverse(Tree T);/*中序遍历二叉树*/
void PostOrderTraverse(Tree T);/*后序遍历二叉树*/
/*创建一颗空树*/
Tree CreateBiTree(){
int array[10] = { 62, 88, 58, 47, 35, 73, 51, 99, 37, 93 };
Tree T = NULL;
for (int i = 0; i < 10; i++){
T = Insert(array[i], T);
}
return T;
}
/*插入二叉树*/
Tree Insert(ElementType X, Tree T){
if (T == NULL){
T = malloc(sizeof(struct TreeNode));
if (T == NULL)
return NULL;
else{
T->data = X;
T->LChild = T->RChild = NULL;
}
}
else
if(X < T->data){
T->LChild = Insert(X, T->LChild);
}
else
if (X > T->data){
T->RChild = Insert(X, T->RChild);
}
return T;
}
/*前序遍历二叉树*/
void PreOrderTraverse(Tree T){
if (T != NULL){
printf("%d ", T->data);
PreOrderTraverse(T->LChild);
PreOrderTraverse(T->RChild);
}
}
/*中序遍历二叉树*/
void InOrderTraverse(Tree T){
if (T != NULL){
InOrderTraverse(T->LChild);
printf("%d ", T->data);
InOrderTraverse(T->RChild);
}
}
/*后序遍历二叉树*/
void PostOrderTraverse(Tree T){
if (T != NULL){
PostOrderTraverse(T->LChild);
PostOrderTraverse(T->RChild);
printf("%d ", T->data);
}
}
//凹入表示法输出二叉树
void Disptree(Tree T)
{
if (T)
{
printf("%d", T->data);
if (T->LChild || T->RChild)
{
printf("(");
Disptree(T->LChild);
if (T->RChild)
printf(",");
Disptree(T->RChild);
printf(")");
}
}
}
/*查找某元素*/
Position FindElement(ElementType X, Tree T){
if (T == NULL)
return NULL;
if (X < T->data)
return FindElement(X, T->LChild);
else
if (X > T->data)
return FindElement(X, T->RChild);
else
return T;
}
/*查找最小元素*/
Position FindMin(Tree T){
if (T == NULL)
return NULL;
else
if (T->LChild == NULL)
return T;
else
return FindMin(T->LChild);
}
/*查找最大元素*/
Position FindMax(Tree T){
if (T == NULL)
return NULL;
else
if (T->RChild == NULL)
return T;
else
return FindMax(T->RChild);
}
/*删除某结点*/
Tree Delete(ElementType X, Tree T){
Position TmpCell;
if (T == NULL)
return NULL;
else
if (X < T->data)
T->LChild = Delete(X, T->LChild);
else
if (X > T->data)
T->RChild = Delete(X, T->RChild);
else
if (T->LChild && T->RChild){/*结点有两个孩子*/
TmpCell = FindMin(T->RChild);
T->data = TmpCell->data;
T->RChild = Delete(T->data, T->RChild);
}
else{/*结点有一个孩子或没有孩子*/
TmpCell = T;
if (T->LChild == NULL)
T = T->RChild;
else if (T->RChild == NULL)
T = T->LChild;
free(TmpCell);
}
return T;
}
void main(){
Tree T;
Position P;
T = CreateBiTree();
printf("生成一颗二叉树(凹入表示法表示):\n");
Disptree(T);
printf("\n\n前序遍历:\n");
PreOrderTraverse(T);
printf("\n中序遍历:\n");
InOrderTraverse(T);
printf("\n后序遍历:\n");
PostOrderTraverse(T);
printf("\n\n插入100后:\n");
T = Insert(100, T);
Disptree(T);
printf("\n插入40后:\n");
T = Insert(40, T);
Disptree(T);
printf("\n删除47后:\n");
T = Delete(47, T);
Disptree(T);
printf("\n删除88后:\n");
T = Delete(88, T);
Disptree(T);
P = FindElement(99, T);
if (P)
printf("\n\n查找元素99(有则返回元素):%d", P->data);
P = FindMin(T);
if (P)
printf("\n最小元素为:%d", P->data);
P = FindMax(T);
if (P)
printf("\n最大元素为:%d", P->data);
}
二叉查找树简要实现
最新推荐文章于 2024-07-24 20:25:39 发布