【算法分析】
本算法改编自严蔚敏《数据结构(C语言版 第2版)》。
本算法的输入是将原始二叉树按下图所示补充“#”号后的二叉树的先序序列ABD#G###CE##F##。
特别提醒,本算法中的先序遍历、中序遍历、后序遍历函数的递归写法,特别清晰简洁。
【算法代码】
#include <bits/stdc++.h>
using namespace std;
struct BiTNode {
char data;
BiTNode *lchild,*rchild;
};
typedef struct BiTNode *BiTree;
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 PreOrderTraverse(BiTree T) {//先序遍历
if(T) {
cout<<T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(BiTree T) {//中序遍历
if(T) {
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T) {//后序遍历
if(T) {
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data;
}
}
int main() {
BiTree tree;
cout<<"请输入建立二叉链表的序列:";
CreateBiTree(tree);
cout<<"先序遍历的结果为:";
PreOrderTraverse(tree);
cout<<endl;
cout<<"中序遍历的结果为:";
InOrderTraverse(tree);
cout<<endl;
cout<<"后序遍历的结果为:";
PostOrderTraverse(tree);
cout<<endl;
return 0;
}
/*
in:
ABD#G###CE##F##
out:
先序遍历的结果为:ABDGCEF
中序遍历的结果为:DGBAECF
后序遍历的结果为:GDBEFCA
*/