设为首页 加入收藏

TOP

C语言实现二叉树的常用的算法(递归与非递归实现遍历) (三)
2014-11-23 22:19:18 来源: 作者: 【 】 浏览:8
Tags:语言 实现 常用 算法
s)
{
if (s != NULL)
{
free(s->base);

s->top = NULL;
s->base = NULL;

s->stackSize = 0;
}
}

//
// 入栈
void Push(Stack *s, StackElemType e)
{
StackElemType *tmp;
if (s->top - s->base >= s->stackSize) // 栈已经满
{
tmp = (StackElemType *)realloc(s->base, (STACK_SIZE_INCREMENT + s->stackSize)
* sizeof(StackElemType));
if (!tmp)
{
exit(OVERFLOW); // 重新分配失败则退出
}

s->base = tmp;
s->top = s->base + s->stackSize;
s->stackSize += STACK_SIZE_INCREMENT;
}

*(s->top) = e;
s->top++;
}

//
// 出栈
void Pop(Stack *s, StackElemType *e)
{
if (s->top == s->base) // 如果栈为空栈
{
return;
}

*e = *(--s->top);
}

//
// 判断栈是否为空
// 返回非0表示空
int IsStackEmpty(Stack s)
{
return !(s.top - s.base);
}

//
// 取栈顶元素
int GetTop(Stack s, StackElemType *e)
{
if (!IsStackEmpty(s))
{
*e = *(s.top - 1); // 此处出错,原因?

return OK;
}
else
{
return ERROR;
}
}
[cpp]
二叉树头文件:
#include

//
// 二叉树的头文件:BinaryTree.h

#ifndef BINARY_TREE_H
#define BINARY_TREE_H

#define OK 1
#define ERROR 0
#define OVERFLOW -1

//
// 结点的数据的类型
typedef char ElemType;

//
// 二叉树结构体
typedef struct tagBinaryTree
{
ElemType data; // 数据
struct tagBinaryTree *lchild; // 指向左孩子
struct tagBinaryTree *rchild; // 指向右孩子
}BTree;

#endif

二叉树头文件:
#include

//
// 二叉树的头文件:BinaryTree.h

#ifndef BINARY_TREE_H
#define BINARY_TREE_H

#define OK 1
#define ERROR 0
#define OVERFLOW -1

//
// 结点的数据的类型
typedef char ElemType;

//
// 二叉树结构体
typedef struct tagBinaryTree
{
ElemType data; // 数据
struct tagBinaryTree *lchild; // 指向左孩子
struct tagBinaryTree *rchild; // 指向右孩子
}BTree;

#endif
[cpp]
二叉树实现文件及测试:
#include
#include

#include "BinaryTree.h"
#include "Queue.h"
#include "Stack.h"

/*****************************************************************************
* 方法名:CreateBinaryTree
* 描述: 递归创建一棵二叉树,按先序输入二叉树中结点的元素的值,“#”号表示空树
* 参数: pBTree--指向BTree结构体的指针的指针
* 返回值:返回OK--表示创建成功
* 返回ERROR--表示创建失败
******************************************************************************/
int CreateBinaryTree(BTree **pBTree)
{
ElemType data;

scanf("%c", &data);

if (data == '#')
{
*pBTree = NULL;

return OK;
}
else
{
if (((*pBTree) = (BTree *)malloc(sizeof(BTree))) == NULL)
{
exit(OVERFLOW);
}

(*pBTree)->data = data;
CreateBinaryTree(&(*pBTree)->lchild); // 创建左子树
CreateBinaryTree(&(*pBTree)->rchild); // 创建右子树
}

return OK;
}

/*****************************************************************************
* 方法名:PreOrderTraverse
* 描述: 先序遍历二叉树
* 参数: pBTree--指向BTree结构体的指针
******************************************************************************/
void PreOrderTraverse(BTree *pBTree)
{
if (pBTree)
{
printf("%c", pBTree->data); // 先序访问根结点

PreOrderTraverse(pBTree->lchild); // 先序遍历左子树
PreOrderTraverse(pBTree->rchild); // 先序遍历右子树
}
}

/*****************************************************************************
* 方法名:InOrderTraverse
* 描述: 中序遍历二叉树
* 参数: pBTree--指向BTree结构体的指针
******************************************************************************/
void InOrderTraverse(BTree *pBTree)
{
if (pBTree)
{
InOrderT

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 3/10/10
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言中malloc函数返回值是否需要.. 下一篇C语言中异常处理的两个函数

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: