您的位置:首页 > 其它

查找二叉树的实现与演示

2016-01-19 21:09 302 查看
最近重新学习了二叉树方面的知识.

写了一个查找二叉树的演示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语言描述
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 实现 演示 demo