PreOrderTraverse(tree);
printf("\n中序遍历(#表示空子树):\n");
InOrderTraverse(tree);
printf("\n后序遍历(#表示空子树):\n");
PostOrderTraverse(tree);
printf("\n树的深度为:%d\n", GetDepth(tree));
printf("\n层序遍历:\n");
LevelOrderTraverse(tree);
printf("\n遍历叶子结点:\n");
TraverseLeafNodes(tree);
fclose(stdin);
printf("\n");
return 0;
}
二叉树实现文件及测试:
#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)
{
InOrderTraverse(pBTree->lchild); // 中序遍历左子树
printf("%c", pBTree->data); // 中序访问根结点
InOrderTraverse(pBTree->rchild); // 中序遍历右子树
}
}
/*****************************************************************************
* 方法名:PostOrderTraverse
* 描述: 后序遍历二叉树
* 参数: pBTree--指向BTree结构体的指针
******************************************************************************/
void PostOrderTraverse(BTree *pBTree)
{
if (pBTree)
{
PostOrderTraverse(pBTree->lchild); // 后序遍历左子树
PostOrderTraverse(pBTree->rchild); // 后序遍历右子树
printf("%c", pBTree->data); // 后序访问根结点
}
}
/*****************************************************************************
* 方法名:LevelOrderTraverse
* 描述: 层序遍历二叉树
* 参数: pBTree--指向BTree结构体的指针
******************************************************************************/
void LevelOrderTraverse(BTree *pBTree)
{
Queue queue; // 队列变量
QueueElemType e; // 队列元素指针变量
InitializeQueue(&queue); // 初始化队列
if (pBTree != NULL)
{
EnQueue(&queue, *pBTree); // 将根结点指针入队
}
while (!IsQueueEmpty(queue))
{
DeQueue(&queue, &e);
printf("%c", e.data);
if (e.lchild != NULL) // 若存在左孩子,则左孩子入队
{
EnQueue(&queue, *e.lchild);
}
if (e.rchild != NULL) // 若存在右孩子,则右孩子入队
{
EnQueue(&queue, *e.rchild);
}
}
}
/*****************************************************************************
* 方法名:GetDepth
* 描述: 获取树的深度
* 参数: pBTree-