C语言
Dev C++
1 实验题目
通过添加虚结点,为二叉树的每一实结点补足其孩子,再对补足虚结点后的二叉树按层次历的次序输入。输出该二叉树先序遍历、中序遍历和后序遍历的结果。
2 基本要求
1)按层次遍历的次序输入数据,构建二叉树(不包含虚结点)。
2)增加左右标志域,将二叉树后序线索化。
3)完成后序线索化树上的遍历算法,依次输出该二叉树先序遍历、中序遍历和后序遍历结果。
3 输入输出样例
Input:
ABC-DEFG–H------
Output:
ABDGCEHF
BGDAEHCF
GDBHEFCA
4 设计思路
层序遍历创建二叉树需要利用队列:先将根结点入队,然后执行下列循环:
从队列中取出对头结点,判断输入字符是否为虚结点,若不是,该字符即为当前结点的数据,并将当前结点的左右孩子指针入队,若当前字符是‘-’,表明当前结点是虚结点,即当前结点的数据为NULL,无需将其左右孩子入队,继续循环直至队列为空。
5 代码
#include<stdio.h>
#include<stdlib.h>
#define link 1
#define child 0
typedef struct BiTNode{
char data;
struct BiTNode* lchild;
struct BiTNode* rchild;
int LTag;
int RTag;
}BiTNode,*BiTree;
typedef struct QNode{
BiTNode* data;
struct QNode* next;
}QNode,*QueuePtr;
typedef struct {
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
}LinkQueue;
void InitBiTNode(BiTree T){
//将树的结点的左右标志域设为child
T->LTag = child;
T->RTag = child;
return ;
}
void InitQueue(LinkQueue *Q){
//队列没有设置哨兵结点
Q->front = Q->rear = NULL;
return ;
}
bool QueueEmpty(LinkQueue *q){
//判断队列是否为空队列,若不是,返回true;否则,返回false
if(q->front == NULL