二叉查找树简要实现

来源:互联网 发布:学电脑软件 编辑:程序博客网 时间:2024/05/29 16:49
/*查找二叉树简要实现 * * */#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;}}elseif(X < T->data){T->LChild = Insert(X, T->LChild);}elseif (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);elsereturn T;}/*查找最小元素*/Position FindMin(Tree T){if (T == NULL)return NULL;elseif (T->LChild == NULL)return T;elsereturn FindMin(T->LChild);}/*查找最大元素*/Position FindMax(Tree T){if (T == NULL)return NULL;elseif (T->RChild == NULL)return T;elsereturn FindMax(T->RChild);}/*删除某结点*/Tree Delete(ElementType X, Tree T){Position TmpCell;if (T == NULL)return NULL;elseif (X < T->data)T->LChild = Delete(X, T->LChild);elseif (X > T->data)T->RChild = Delete(X, T->RChild);elseif (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);}

0 0
原创粉丝点击