/*
此处采用的是递归法求出二叉树的先序,中序,后序遍历,当然也可以用非递归算法,利用栈求解,但对比觉得用递归更简单 。
此题的思考思路如下,1、写好头文件 2、定义结构体 ,思考二叉树中 有哪些属性,都可以放入二叉树的结构体中,(结构体可以用 链表存储,
所以对于节省空间是非常好的手段哦) 3、写主函数,主函数中当然要创建结构体的对象,然后创建结构体,然后调用先序,中序,后序函数,
当然此时的这些函数名都会出现红色的波浪线,因为你还没有定义这些函数呀,既然使用了,当然要去创建 4、去创建创建函数,先序函数,中序函数,
后序函数,再根据这个函数的要求,即怎么做才会得到这个结果的思路转换成高级语言,如:创建函数,你首先当然要有元素,才能去构建二叉树 所以
要先传入元素,char ch = getchar(); 这句就代表元素的输入,也等价于 char ch; cin>>ch; 然后就要判断从外界得到的值是什么了,可以是一个具体的
值也可以是某个特殊的 字符,当然你可以用特殊的字符来代表该位置的元素为空, 如果不为空,则你可以先为这树分配空间,把值赋值到对应的位置上
很容易发现创建左右孩子跟 创建某个结点是一样的,所以可以调用本身去创建左右孩子,先序,中序,后序函数也是这样思考,你需要先有思路,再把
思路转换成对应的语句就可以了 (要是有什么错误 ,欢迎各位留言指出)
*/
//二叉树的先序,中序,后序遍历
#include<iostream>#include<malloc.h>
using namespace std;
//二叉树结构体的定义
typedef struct Node //Node为结构体的名称
{
char data; //定义一个字符型的元素
struct Node *lchild; //定义一个左孩子,指针类型
struct Node *rchild; //定义一个右孩子,指针类型
}Node,*BiTree; //BiTree是结构体的指针
//创建函数,构建二叉树
void create(BiTree &bt)
{
char ch = getchar(); //定义一个变量,用来接收从外界传入的字符
//cin >> ch;
if (ch == '#') //如果输入的字符为#,则代表该位置没有值
{
bt = NULL; //给不存在元素的位置赋值为空
}
else
{
bt = (Node *)malloc(sizeof(Node)); //如果该位置存在元素,则先为二叉树分配空间
bt->data= ch; //把得到的值作为该位置的元素
create(bt->lchild); //创建左孩子
create(bt->rchild); //创建 右孩子
}
}
//打印函数,输出正在访问位置的元素值
void visit(BiTree bt)
{
cout << bt->data ;
}
//先序函数
void PreOder(BiTree bt)
{
if (bt) //判断该位置是否存在
{
visit(bt); //如果该位置存在,则输出
PreOder(bt->lchild); //对左孩子进行先序遍历
PreOder(bt->rchild); //对右孩子进行先序遍历
}
}
//中序遍历
void InOder(BiTree bt)
{
if (bt)
{
InOder(bt->lchild); //对左孩子进行中序遍历
visit(bt); //打印出根结点
InOder(bt->rchild); //对左孩子进行中序遍历
}
}
void PostOrder(BiTree bt)
{
if (bt)
{
PostOrder(bt->lchild); //对左孩子进行后序遍历
PostOrder(bt->rchild); //对左孩子进行后序遍历
visit(bt); //打印出根结点
}
}
int main()
{
BiTree bt=NULL; //创建一个二叉树指针类型的对象
cout <<"请先序序列输入结点:" << endl;
create(bt); //创建二叉树
cout << "先序排序后的结果为:" << endl;
PreOder(bt); //调用先序排序函数
cout << endl;
cout << "中序排序后的结果为:" << endl;
InOder(bt); //调用中序排序函数
cout << endl;
cout << "后序排序后的结果为:" << endl;
PostOrder(bt); //调用后序排序函数
system("pause");
return 0;
}