二叉查找树的各种操作

来源:互联网 发布:rs232c vb 编辑:程序博客网 时间:2024/05/21 10:11
作    者:王鹏   * 完成日期:2016年 3 月 13 日    * 问题描述:二叉查找树的各种操作    * 输入描述:以0代替树的儿子为空* 程序输出:如代码所示  
#include<stdio.h>#include<stdlib.h>typedef struct TreeNode *SearchTree;typedef struct TreeNode *Position;typedef int ElementType; typedef struct TreeNode{ElementType Element;SearchTree Left;SearchTree Right;}BiTNode;//二叉查找树的函数声明 SearchTree CreateTree();                                      //创建二叉树 Position Find(ElementType X, SearchTree T);                   //查找 Position FindMax(SearchTree T);Position FindMin(SearchTree T);SearchTree Insert(ElementType X, SearchTree T);               //插入 SearchTree Delete(ElementType X, SearchTree T);               //删除 void PreOrder_1(SearchTree T);                                //先序遍历(递归) int main(){SearchTree T;ElementType Element;int flag = 1, i;    printf("                   本程序实现二叉查找树的基本操作。                     \n");   while(flag){printf("|                                                                      |\n"); printf("|**********************************************************************|\n");printf("|                        二叉查找树的基本操作如下:                    |\n");printf("|                           0.创建二叉树                               |\n");printf("|                           1.查找                                     |\n");printf("|                           2.插入                                     |\n");printf("|                           3.删除                                     |\n");printf("|                           4.将二叉查找树遍历                         |\n");printf("|**********************************************************************|\n"); printf("|                           请选择功能:                               |\n"); scanf("%d", &i);                         //输入需要选择的功能 switch(i){case 0:printf("请输入二叉树的根结点(0代表NULL):");T = CreateTree();break; case 1:if(T){printf("请输入要查找的元素:");scanf("%d", &Element);     if( Find(Element, T))        printf("该元素存在!\n");else printf("该元素不存在!\n");}else    printf("       二叉查找树为空!\n");break; case 2:if(T){printf("请输入要插入的元素:");scanf("%d", &Element); T = Insert(Element, T); }else    printf("       二叉查找树为空!\n");break;   case 3:if(T){printf("请输入要删除的元素:");    scanf("%d", &Element); T = Delete(Element, T); }else    printf("       二叉查找树为空!\n");break;case 4:if(T){printf("(先序)遍历的结果为:");PreOrder_1(T);printf("\n"); }else    printf("       二叉树为空!\n");break;default:    flag = 0;printf("程序运行结束,按任意键退出!\n");}  }return 0;} //二叉查找树的函数 SearchTree CreateTree()                            //创建二叉树 {ElementType ch;SearchTree T; scanf("\n%d", &ch);if(ch == 0)   T = NULL;else{if(!(T = (SearchTree)malloc(sizeof(BiTNode))))   exit(-1);T->Element  = ch;printf("%d的左儿子为:", T->Element ); T->Left = CreateTree(); printf("%d的右儿子为:", T->Element ); T->Right = CreateTree();}   return T; }Position Find(ElementType X, SearchTree T)     //二叉树的查找 {if(T == NULL)    return NULL;if(X < T->Element)    return Find(X, T->Left);else if(X > T->Element)    return Find(X, T->Right);else    return T;    } Position FindMax(SearchTree T)                 //找最大值(非递归) {if(T != NULL){while(T->Right != NULL )    T = T->Right;    }  return T;    }// Position FindMax(SearchTree T)              //找最大值(递归) //{//if(T == NULL)//      return NULL;//  else if(T->Right == NULL)//    return T;//else//    return FindMax(T->Right);    //}Position FindMin(SearchTree T)                 //找最小值(非递归) {if(T != NULL){while(T->Left != NULL )    T = T->Left;    }  return T;    }// Position FindMin(SearchTree T)              //找最小值(递归) //{//if(T == NULL)//      return NULL;//  else if(T->Left == NULL)//    return T;//else//    return FindMax(T->Left);    //}SearchTree Insert(ElementType X, SearchTree T)  //插入元素到二叉树 {if(T == NULL){if(!(T = malloc(sizeof(struct TreeNode))))    exit(-1);else{T->Element = X;T->Left = T->Right = NULL;}    }else if(X < T->Element)    T->Left = Insert(X, T->Left); else if(X > T->Element)    T->Right = Insert(X, T->Right);return T;  }SearchTree Delete(ElementType X, SearchTree T)  //删除元素 {Position TmpCell;if(T == NULL)    printf("没找到\n"); else if(X < T->Element)    T->Left = Delete(X, T->Left);else if(X > T->Element)    T->Right = Delete(X, T->Right);else if(T->Left && T->Right){TmpCell = FindMin(T->Right);T->Element = TmpCell->Element;T->Right = Delete(T->Element, T->Right);}else{TmpCell = T;if(T->Left == NULL)    T = T->Right;else if(T->Right == NULL)    T = T->Left;free(TmpCell);     }return T;}   void PreOrder_1(SearchTree T)                      //先序遍历(递归) {if(T){printf("%d  ", T->Element);PreOrder_1(T->Left);PreOrder_1(T->Right);} }  


0 0
原创粉丝点击