二叉查找树的各种操作
来源:互联网 发布: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
- 二叉查找树的各种操作
- 二叉查找树的各种操作
- 二叉查找树的各种操作源码
- 二叉查找树的各种操作
- 二叉查找树的各种操作C++实现
- java实现一个二叉查找树的各种操作
- 二叉查找树的各种操作C++实现
- 二叉查找树 各种操作及其初始化
- 二叉查找树的各种操作(插入、删除、查找、遍历)
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉查找树的操作
- 二叉查找树的操作
- 从start_kernel到init
- Android 6.0中新的权限模型介绍
- 如何把答题记录显示到页面上去
- 浏览器多进程&多连接&keepalive&请求合并
- Swift - Singleton
- 二叉查找树的各种操作
- 求最大子序列算法
- 跳表(skiplist)的原理和实现
- doc环境导出数据库操作
- SlidingMenu的学习
- Android Studio 的安装和配置篇(Windows篇)
- linux下所有软件的汇总
- 常用数论结论
- Java静态域与静态方法