二叉树的遍历可以采用递归和非递归的方法,本文使用递归遍历的方法,只给出了创建和遍历的算法。
参考书籍
大话数据结构
代码如下:
#include<stdio.h>
#include<stdlib.h>
//定义节点结构
typedef struct BTnode
{
char data;
struct BTnode *plchild;
struct BTnode *prchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree *); //构造子树
void PreOrderTraverse(BiTree );//先序遍历子树
void CreateBiTree(BiTree *T)//注意,这里传递的是二级指针
{
char ch;
ch=getchar();//可以用scanf代替
if (ch=='#')
{
*T=NULL;
}
else
{
(*T)=(BiTree)malloc(sizeof(BiTNode));
(*T)->data=ch; // 生成根结点
CreateBiTree(&(*T)->plchild); // 构造左子树
CreateBiTree(&(*T)->prchild); // 构造右子树
}
}
void PreOrderTraverse(BiTree T) //先序遍历二叉树,中序遍历与后序遍历与先序类似,改变输出位置即可
{
if (T==NULL) //递归的出口
{
return;
}
printf("%c",T->data);
PreOrderTraverse(T->plchild);
PreOrderTraverse(T->prchild);
}
int main()
{
BiTree T=NULL; //T为根节点
CreateBiTree(&T) ;
PreOrderTraverse(T);
return 0;
}
测试:
以最简单的二叉树为例
需要注意的点:
1 必须要将每个节点的空指针引出一个虚节点,其值为特值,如’#’,否则创建树的时候可能会死递归。如图
2 getchar输入的时候,要一次性输入ab##c##
3 关于二级指针的问题:
第一种方法
在写创建二叉树时,也存在第二种写法不需要使用二级指针
BiTree CreatBiTree()
{
char ch;
BiTNode *T=NULL;
ch=getchar();
if(ch=='#')
{
return NULL;
}
else
{
T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=ch;
T->plchild=CreatBiTree();
T->prchild=CreatBiTree();
return T;
}
}