其实就是递归的思想。书上有说先序递归实现的,方法都是一样。本程序的输入都是先序序列,只是建立二叉树的方法不一样。
关于遍历二叉树的代码,下一篇再写。
先序建立二叉树:先访问根节点,再左子树,再右子树。
void CreateBiTree(BiTree *T)//先序建树
{
char ch;
scanf("%c",&ch);
if(ch=='#') *T=NULL;
else{
*T = (BiTNode *)malloc(sizeof(BiTNode));//分配空间
if(!(*T))//分配空间失败
return;
(*T)->data=ch;//生成根结点
CreateBiTree(&(*T)->lchild);//生成左子树
CreateBiTree(&(*T)->rchild);//生成右子树
}
return;
}
中序建立:先左子树,再访问根节点,再右子树。
void CreateBiTree(BiTree *T)//中序建立二叉树
{
char ch;
scanf("%c",&ch);
if(ch=='#')
{
*T = NULL;
}
else
{
*T = (BiTNode *)malloc(sizeof(BiTNode));//分配空间
CreateBiTree(&(*T)->lchild);//生成左子树
(*T)->data = ch;
CreateBiTree(&(*T)->rchild);//生成右子树
}
}
后序建立:先左子树,再右子树,再访问根节点。
void CreateBiTree(BiTree *T)//后序建立树
{
char ch;
scanf("%c",&ch);
if(ch=='#')
{
*T = NULL;
}
else
{
*T = (BiTNode *)malloc(sizeof(BiTNode));//分配空间
CreateBiTree(&(*T)->lchild);//生成左子树
CreateBiTree(&(*T)->rchild);//生成右子树
(*T)->data = ch;
}
}
测试:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char TElemType;//定义二叉树中数据元素类型
typedef struct BiTNode{//二叉树的二叉链表储存表示
TElemType data;
struct BiTNode *lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;
void InitBiTree(BiTree *T)//构造空二叉树
{
*T = NULL;
}
int main()
{
BiTree BT;
InitBiTree(&BT);//构造空二叉树
CreateBiTree(&BT);//递归建立二叉树
PreOrder(BT);
return 0;
}
难以理解的话,试一下简单的模拟递归。