二叉树的先序,中序,后序遍历

/*

此处采用的是递归法求出二叉树的先序,中序,后序遍历,当然也可以用非递归算法,利用栈求解,但对比觉得用递归更简单 。

此题的思考思路如下,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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值