注意:
构造二叉树的时候要用双重指针,用单重指针时,要有返回值。
代码如下:
/*
此处输入空格代表空,默认按前序遍历完全二叉树的方式输入数据
形参是在执行函数时自动分配的,没有执行这个函数之前不占用存
储空间,当函数执行完毕后释放这个形参,所以我们要使用到双重指
针来构造树。这样,我们传进去的是树节点的指针的指针,这样函数
执行完成后即使这个“指针的指针“被释放掉了,我们通过*T保存的树
结点的数据还是可以通过树节点的指针T来调用。相反,如果我们传
进去如果是树结点的指针,当这个函数执行完毕后,这个指针被销毁
了,而且CreateBiTree()函数不返回任何值,所以等于这个函数没有
被调用。
*/
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode,*BiTree;
typedef struct BiTNode *LinkTree;
void CreateBiTree(BiTree *T)
{
char c;
scanf("%c",&c);
if(' ' == c)
{
(*T) = NULL;
}
else
{
(*T) = (LinkTree)malloc(sizeof(BiTNode));
(*T)->data = c;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
void PreOrderTraverse(BiTree T,int level)
{
if(T)
{
printf("%c->",T->data);
PreOrderTraverse(T->lchild,level+1);
PreOrderTraverse(T->rchild,level+1);
}
}
void InOrderTraverse(BiTree T,int level)
{
if(T)
{
InOrderTraverse(T->lchild,level+1);
printf("%c->",T->data);
InOrderTraverse(T->rchild,level+1);
}
}
void PostOrderTraverse(BiTree T,int level)
{
if(T)
{
PostOrderTraverse(T->lchild,level+1);
PostOrderTraverse(T->rchild,level+1);
printf("%c->",T->data);
}
}
int main()
{
int level = 1;
BiTree T = NULL;
CreateBiTree(&T);
printf("前序遍历的结果为:\n");
PreOrderTraverse(T,level);
printf("\n中序遍历的结果为:\n");
InOrderTraverse(T,level+1);
printf("\n后序遍历的结果为:\n");
PostOrderTraverse(T,level);
return 0;
}