查找二叉树的实现与演示
2016-01-19 21:09
302 查看
最近重新学习了二叉树方面的知识.
写了一个查找二叉树的演示Demo
代码如下:
SearchTree.h
SearchTree.cpp
main.cpp
参考书籍: 数据结构与算法分析 c语言描述
写了一个查找二叉树的演示Demo
代码如下:
SearchTree.h
/* * SearchTree.h * * Created on: Jan 13, 2016 * Author: youngwan */ #ifndef SEARCHTREE_H_ #define SEARCHTREE_H_ typedef int ElementType; typedef struct _TreeNode_ { ElementType Element; struct _TreeNode_ *Left; struct _TreeNode_ *Right; }TreeNode, *Tree, *SearchTree, *Position; SearchTree MakeEmpty(SearchTree T); Position Find(ElementType X, SearchTree T); Position FindMin(SearchTree T); Position FindMax(SearchTree T); SearchTree Insert(ElementType X, SearchTree T); SearchTree Delete(ElementType X, SearchTree T); int Height(SearchTree T); #endif /* SEARCHTREE_H_ */
SearchTree.cpp
/* * SearchTree.c * * Created on: Jan 13, 2016 * Author: youngwan */ #include <stdio.h> #include <stdlib.h> #include <vector> #include "SearchTree.h" using namespace std; SearchTree MakeEmpty(SearchTree T) { if (NULL != T) { MakeEmpty(T->Left); MakeEmpty(T->Right); free(T); } return NULL; } Position Find(ElementType X, SearchTree T) { if (NULL == T) 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 FindMin(SearchTree T) { if (NULL == T) return NULL; else if (NULL == T->Left) return T; else return FindMin(T->Left); } Position FindMax(SearchTree T) { if (NULL == T) return NULL; else if (NULL == T->Right) return T; else return FindMax(T->Right); } /*非递归实现 查找最小*/ Position FindMin2(SearchTree T) { if (NULL != T) while(NULL != T->Left) T = T->Left; return T; } /*非递归实现 查找最大*/ Position FindMax2(SearchTree T) { if (NULL != T) while(NULL == T->Right) T = T->Right; return T; } SearchTree Insert(ElementType X, SearchTree T) { if (NULL == T) { T = (SearchTree)malloc(sizeof(TreeNode)); if (NULL == T) { fprintf(stderr, "malloc Error"); return NULL; } 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 (NULL == T) { fprintf(stderr, "Element not found"); return NULL; } 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) /*have two child*/ { TmpCell = FindMin(T->Right); /*find the smallest in right sub tree, set it be root node*/ T->Element = TmpCell->Element; T->Right = Delete(T->Element, T->Right); /*right sub tree become it delete T*/ } else /*have one or zero child*/ { TmpCell = T; if (NULL == T->Left) T = T->Right; else if (NULL == T->Right) T = T->Left; free(TmpCell); } return T; } int Height(SearchTree T) { int lDeep, rDeep; if (NULL == T) return -1; lDeep = Height(T->Left); rDeep = Height(T->Right); return 1 + (lDeep > rDeep ? lDeep : rDeep); }
main.cpp
/* * main.cpp * * Created on: Jan 16, 2016 * Author: youngwan */ #include <vector> #include <stdio.h> #include <string.h> #include <stdlib.h> #include "SearchTree.h" using namespace std; static int power(int m, int n) { int result = 1; while((n--) > 0) { result *= m; } return result; } void Print(Tree root) { vector<Tree> vecTree[2]; int current = 0; int next = 1; int height, preSpace, mulSpace, i; if (root == NULL) { fprintf(stderr, "root is null\n"); return ; } height = Height(root); vecTree[current].push_back(root); while (height >= 0) { preSpace = power(2, height) - 1; mulSpace = power(2, height + 1) - 1; for(i = 0; i < preSpace; i++) printf(" "); for(vector<Tree>::iterator iter = vecTree[current].begin(); iter < vecTree[current].end(); iter++) { if (NULL == (*iter)) { printf(" "); vecTree[next].push_back(NULL); vecTree[next].push_back(NULL); } else { printf("%-2d", (*iter)->Element); vecTree[next].push_back((*iter)->Left); vecTree[next].push_back((*iter)->Right); } for(i = 0; i < mulSpace; i++) printf(" "); } printf("\n"); vecTree[current].clear(); current = 1 - current; next = 1 - next; height--; } } void Show(Tree root) { if (NULL == root) { fprintf(stderr, "root is empty!\n"); } else { Position pMax, pMin; int height; pMax = FindMax(root); pMin = FindMin(root); height = Height(root); printf("Max : %d\n", pMax->Element); printf("Min : %d\n", pMin->Element); printf("High : %d\n", height + 1); } } void FindElement(Tree root) { char buffer[1024] = {0}; int ret = 0; char *p = NULL; printf("Please input Digit you want find, split by ','!\n"); ret = scanf("%s", buffer); if (ret <= 0) { printf("Error, ret:%d\n", ret); return ; } p = strtok(buffer, ","); while(p) { if((*p) > '0' && (*p) <= '9') { ret = atoi(p); if (NULL == Find(ret, root)) printf("%d is not found\n", ret); else printf("%d is found\n", ret); } p = strtok(NULL, ","); } } Tree OperatorInsert(Tree root) { char buffer[1024] = {0}; int ret = 0; char *p = NULL; printf("Please Input Digit you want insert, split by ','!\n"); ret = scanf("%s", buffer); if (ret <= 0) { printf("Error, ret:%d\n", ret); return root; } p = strtok(buffer, ","); while(p) { if((*p) > '0' && (*p) <= '9') { ret = atoi(p); root = Insert(ret, root); } p = strtok(NULL, ","); } return root; } Tree OperatorDelete(Tree root) { char buffer[1024] = {0}; int ret = 0; char *p = NULL; printf("Please Delete Digit you want insert, split by ','!\n"); ret = scanf("%s", buffer); if (ret <= 0) { printf("Error, ret:%d\n", ret); return root; } p = strtok(buffer, ","); while(p) { if((*p) > '0' && (*p) <= '9') { ret = atoi(p); root = Delete(ret, root); } p = strtok(NULL, ","); } return root; } int main(void) { Tree root = NULL; char input[1024]; printf("Usage: insert only support digit(>0)\n"); while(1) { printf("(I:insert; D:delete; C:clear; P:print; S:Show; F:Find)\n"); printf("Please Input operator.\n"); scanf("%s", input); switch(input[0]) { case 'I': case 'i': root = OperatorInsert(root); break; case 'D': case 'd': root = OperatorDelete(root); break; case 'C': case 'c': root = MakeEmpty(root); break; case 'P': case 'p': Print(root); break; case 'S': case 's': Show(root); break; case 'F': case 'f': FindElement(root); break; default:break; } } return 1; }
参考书籍: 数据结构与算法分析 c语言描述
相关文章推荐
- JavaScript演示排序算法
- AVL树-自平衡二叉查找树(Java实现)
- 用PS实现纹理浮雕效果代码
- 用vbs实现cmd功能的代码
- 用双网卡实现三机互联
- C#中实现判断某个类是否实现了某个接口
- DL.DT.DD实现左右的布局简单例子第1/2页
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- C++非递归队列实现二叉树的广度优先遍历
- 用PHP实现文件上传
- 无限级别菜单的实现
- 留言板翻页的实现详解
- WinForm中的登录实现
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- javascript demo 基本技巧
- Jquery promise实现一张一张加载图片
- JavaScript iframe数据共享接口实现方法
- ibatis简单实现与配置
- jsp实现购物程序