实现二叉树创建及遍历算法。
函数接口定义:
void CreateBiTree(BiTree &T);//根据输入的字符串,创建二叉树。
void PreOrder(BiTree T);//先序遍历二叉树
void InOrder(BiTree T);//中序遍历二叉树
void PostOrder(BiTree T);//后序遍历二叉树
void LevelOrder(BiTree T);//层次遍历二叉树
其中 T
表示二叉树类型。
裁判测试程序样例:
#include<iostream>
using namespace std;
typedef struct BiNode{
char data;
struct BiNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree &T);//根据输入的字符串,创建二叉树。
void PreOrder(BiTree T);//先序遍历二叉树
void InOrder(BiTree T);//中序遍历二叉树
void PostOrder(BiTree T);//后序遍历二叉树
void LevelOrder(BiTree T);//层次遍历二叉树
int main(){
BiTree T;
CreateBiTree(T);
cout<<"PreOrder:";
PreOrder(T);
cout<<endl<<"InOrder:";
InOrder(T);
cout<<endl<<"PostOrder:";
PostOrder(T);
cout<<endl<<"LevelOrder:";
LevelOrder(T);
return 0;
}
/* 请在这里填写答案 */
输入样例:
AB#C##D#EF###
输出样例:
输出拓扑序列。
PreOrder:ABCDEF
InOrder:BCADFE
PostOrder:CBFEDA
LevelOrder:ABDCEF
函数:
void CreateBiTree(BiTree& T) {//根据输入的字符串,创建二叉树
char ch;
cin >> ch;
if (ch == '#') {
T = NULL;//此指针置空
}
else {
T = new BiTNode;//为指针指向地址创造空间
T->data = ch;//数据域赋值
CreateBiTree(T->lchild);//递归左儿子
CreateBiTree(T->rchild);//递归右儿子
}
}
void PreOrder(BiTree T) {//先序遍历二叉树
if (T) {//当此指针不为空时
cout << T->data;//输出其数据域
PreOrder(T->lchild);//进入递归
PreOrder(T->rchild);
}
}
void InOrder(BiTree T) {//中序遍历二叉树
if (T) {
InOrder(T->lchild);
cout << T->data;
InOrder(T->rchild);
}
}
void PostOrder(BiTree T) {//后序遍历二叉树
if (T) {
PostOrder(T->lchild);
PostOrder(T->rchild);
cout << T->data;
}
}
void LevelOrder(BiTree T) {//层次遍历二叉树
BiTree stack[80];//创造一个可以存80个节点的指针数组
int front, real = 0;//头和尾初始化0;
front = real;
BiTree curr, pre;//创造pre(pre处理当前指针)curr(curr处理左右儿子指针)
pre = T;//头 pre指向T的头结点。
while (pre != NULL) {
// 输出当前节点的值
cout << pre->data;
// 拿到当前节点的左孩子指针
curr = pre->lchild;
//如果左孩子不为空 入队!
if (curr != NULL) {
stack[real++] = curr;
}
// 如果右孩子不为空 入队!
curr = pre->rchild;
if (curr != NULL) {
stack[real++] = curr;
}
// 如果队列不为空则从队列取出元素
if (front != real)
pre = stack[front++];
else //否则直接置空指针
pre = NULL;
}
}