1.二叉树的建立和遍历(C语言实现)
typedef struct BiTNode {
TElemType data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
2.二叉树的建立
按照先序建立二叉树
void CreatBiTree(BiTree* T)
{
TElemType ch;
scanf("%c",&ch);
if(ch == '#')
{
*T = NULL; //如果输入为#就将结点的地址设为NULL
}
else
{
*T = (BiTree) malloc(sizeof(BiTNode));
if(!T)
{
exit(OVERFLOW);
}
(*T)->data = ch;
CreatBiTree(&(*T)->lchild);
CreatBiTree(&(*T)->rchild);
}
}
3.二叉树的遍历(递归实现)
3.1先序遍历
void PreOrderTraverse(BiTree T)
{
if(!T)
{
return;
}
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
3.2中序遍历
void InOrderTraverse(BiTree T)
{
if(!T)
{
return;
}
InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
3.3后序遍历
void PostOrderTraverse(BiTree T)
{
if(!T)
{
return;
}
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}
4.完整代码
/*二叉树*/
#include <stdio.h>
#include <stdlib.h>
#define OVERFLOW 0
typedef char TElemType;
//定义树的结点的结构,BiTree结点的指针变量
typedef struct BiTNode {
TElemType data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
void CreatBiTree(BiTree* T)
{
TElemType ch;
scanf("%c",&ch);
if(ch == '#')
{
*T = NULL; //如果输入为#就将结点的地址设为NULL
}
else
{
*T = (BiTree) malloc(sizeof(BiTNode));
if(!T)
{
exit(OVERFLOW);
}
(*T)->data = ch;
CreatBiTree(&(*T)->lchild);
CreatBiTree(&(*T)->rchild);
}
}
//前序遍历的递归实现
void PreOrderTraverse(BiTree T)
{
if(!T)
{
return;
}
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
//中序遍历的递归实现
void InOrderTraverse(BiTree T)
{
if(!T)
{
return;
}
InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
//后续遍历的递归实现
void PostOrderTraverse(BiTree T)
{
if(!T)
{
return;
}
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}
int main()
{
printf("请按照先序顺序对二叉树进行输入:");
BiTree t;
CreatBiTree(&t);
printf("二叉树建立成功!!!\n");
printf("前序遍历:");
PreOrderTraverse(t);
printf("\n");
printf("中序遍历:");
InOrderTraverse(t);
printf("\n");
printf("后序遍历:");
PostOrderTraverse(t);
printf("\n");
return 0;
}