二叉树的层次建树及先中后序遍历。(c++)
一、层次建立引用队列
二、遍历(采用递归)
先序遍历(深度优先遍历)
先打印自身,再打印左子树,再打印右子树。
中序遍历
先打印左子树,后打印自身,再打印右子树。
后序遍历
先打印左子树,再打印右子树,最后打印自身。
三、代码如下:
function.h代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef char BiElemType;
typedef struct TNode{
BiElemType d;
TNode *lchild;
TNode *rchild;
}TNode,*BiTree;
typedef struct tog{
BiTree information;
struct tog *inext;
}tog_t,*TQue;
函数的入口:
#include "function.h"
/**
* abcdefghij
* @return
*/
/**
* abdhiejcfg
* hdibjeafcg
* hidjebfgca
* @param tree
*/
void PreOrder(BiTree tree){
if(tree!=NULL){
printf("%c",tree->d);
PreOrder(tree->lchild);
PreOrder(tree->rchild);
}
}
void InOrder(BiTree tree){
if(tree!=NULL){
InOrder(tree->lchild);
printf("%c",tree->d);
InOrder(tree->rchild);
}
}
void PostOrder(BiTree tree){
if(tree!=NULL){
PostOrder(tree->lchild);
PostOrder(tree->rchild);
printf("%c",tree->d);
}
}
int main() {
BiTree tree;//定义一个树
tree=NULL;//使树为空(没有任何根系)
BiElemType element;//定义一个树的数据结构类型的变量,用来存放标准输入的数
TQue front=NULL,rear=NULL,qnew,qcur=NULL;//队列的头指针、尾指针、新结点,指向父系结点的指针
BiTree tnew;//树的新结点
while(scanf("%c",&element)){ //层次建树
if(element=='\n'){//回车结束
break;
}
tnew=(BiTree)calloc(1,sizeof(TNode));//为树的新结点申请空间,空间大小为两个参数的乘积,并赋值为0(NULL)
tnew->d=element;//将输入的值赋给树的新结点的数据域
qnew=(TQue)calloc(1,sizeof(TNode));//同理
qnew->information=tnew;//将树的新结点的地址存入队列新结点的数据域--换句话说通过队列间接访问树的新结点的数据域的值
if(tree==NULL){//当树为空时,将根指向树的新结点,队列的头尾指针指向第一个结点,指向树的父系指针指向队列的第一个结点
tree=tnew;
front=qnew;
rear=qnew;
qcur=qnew;
}else{
rear->inext=qnew;//将队列的尾指针指向新结点
rear=qnew;
if(NULL==qcur->information->lchild){//如果某父亲结点没有左孩子则将左指针指向新结点
qcur->information->lchild=tnew;
}else if(NULL == qcur->information->rchild){//如果某父亲结点没有右孩子则将右指针指向新结点
qcur->information->rchild=tnew;
qcur=qcur->inext;
}
}
}
printf("----------------PreOrder---------------\n");
PreOrder(tree);//深度优先遍历
printf("\n");
printf("----------------InOrder---------------\n");
InOrder(tree);//中序遍历
printf("\n");
printf("----------------PostOrder---------------\n");
PostOrder(tree);//后序遍历
printf("\n");
return 0;
}