二叉查找树的各种操作
2016-03-13 22:07
309 查看
作 者:王鹏 * 完成日期: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); } }
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- Redis中实现查找某个值的范围
- 批量文件查找替换功能的vbs脚本
- WinForm实现按名称递归查找控件的方法
- 一个用vbs查找硬盘所有分区中的指定程序的代码
- 浅析Node.js查找字符串功能
- C语言二叉树的非递归遍历实例分析
- C++二分法在数组中查找关键字的方法
- C++中字符串查找操作的两则实例分享
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- WinForm自定义函数FindControl实现按名称查找控件
- Shell脚本学习指南之查找与替换介绍
- C++非递归队列实现二叉树的广度优先遍历
- php实现指定字符串中查找子字符串的方法
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- C#查找对象在ArrayList中出现位置的方法
- jquery 查找新建元素代码
- Oracle 查找与删除表中重复记录的步骤方法
- SQL Server根据分区表名查找所在的文件及文件组实现脚本