转载:http://blog.youkuaiyun.com/pony_maggie/article/details/38390513
问题及答案:
//链式结构
typdef struct _BiTNode
{
int date;
_BiNode *lchild;
_BiNode *rchild;
}BitNode,*pBiTTree;
//创建二叉树,先序顺序
int CreatBiTree(pBiTree *root)
{
char ch = 0;
fflush(stdin);
if((ch = getchar())=='a') //控制树的结构
{
*root = NULL;
}
else
{
*root = (BiTNote*)malloc(sizeof(BiTNode));
if(!(*root))
{
return RET_ERROR;
}
(*root)->date = GetRandom();
CreateBiTree(&(*root))->lChild;
CreateBiTree(&(*root))->rChild;
}
return RET_OK;
}
int g_i = 0; //定义这个的目的?
//创建二叉树,自动执行,方便测试
int CreateBiTreeAuto(pBiTree *root)
{
char szOrder[] = "aaabbbccc";
char ch = 0;
if(szOrder[g_i++] == 'a') //控制结构
{
*root = NULL;
}
else
{
*root = (BiTNode*)malloc(sizeof(BiTNode));
if(!(*root))
{
return RET_ERROR;
}
(*root)->date = GetRandom();
CreateBiTreeAuto(&(*root))->lChild;//递归调用
CreateBiTreeAuto(&(*root))->rChild;
}
return RET_OK;
}
//先序遍历
int PreOrderVisitTree(pBiTree T, VisitType pFuncVisit)
{
if (T)
{
(*pFuncVisit)(T->data);
if (PreOrderVisitTree(T->leftChild, pFuncVisit) == RET_OK)
{
if (PreOrderVisitTree(T->rightChild, pFuncVisit) == RET_OK)
{
return RET_OK;
}
}
return RET_ERROR; //这里为何返回错误?
}
else
{
return RET_OK;
}
/*中序遍历和后序遍历,非递归方法,
用栈结构存储结点信息,通过出栈访问遍历二叉树*/
int InOrderVisitTree(pBiTree T,VisitType pFuncVisit)
{
ponyStack binaryTreeStack; //binary 二进制
InitStack(&binaryTreeStack,4);
Push(&binaryTreeStack,&T); //压栈
pBiTree pTempNote;//临时结点
while (!IsEmptyStack(binaryTreeStack))
{
while((GetTop(binaryTreeStack,&pTempNode) == RET_OK) && (pTempNode != NULL))
{
Push(&binaryTreeStack,&pTempNode->leftChild);
}
Pop(&binaryTreeStack,&pTempNode);
if (!IsEmptyStack(binaryTreeStack))
{
Pop(&binaryTreeStack,&pTempNode);
(*pFuncVisit)(pTempNote->date);
Push(&binaryTreeStack,&(pTempNode->rightChild));
}
}
return RET_OK;
}
/*代码下载地址:
http://download.youkuaiyun.com/detail/pony_maggie/7714493
或
https://github.com/pony-maggie/BinaryTreeDemo */