作为一个立志要好好学习的蒟蒻,搜集了好多关于数据结构的资料。对于树的遍历这点,看网上那帮大佬的指针做法,不禁瑟瑟发抖。其实对于指针的做法,我们可以用数组来模拟指针,效率也是很快。
二叉树的三种深搜遍历分为先序遍历、中序遍历和后序遍历。
先序遍历:先遍历根节点,然后左子树,最后右子树【根左右】
中序遍历:先遍历左子树,然后根节点,最后右子树【左根右】
后序遍历:先遍历左子树,然后右子树,最后根节点【左右根】
如下图qwq
所以说对于这个图呢,先序遍历就是:A->B->D->H->I->E->C->F->G
中序遍历就是:H->D->I->B->E->A->F->C->G->
后序遍历就是:H->I->D->E->B->F->G->C->A
所以对于先序中序后序遍历的方式就很显然了,其实就是遍历顺序的不同
下面附代码示例(以先序遍历的输入为准)
#include<iostream>
using namespace std;
const char inf='Z';
struct NODE{
char a;//结点的内容
int pr;//父结点的数组下标位置 ;
int l;//左子树下标位置;
int r;//右子树下标位置;
}node[100];
void input (int m)//由于是先序遍历输入,所以需要递归输入;
{
cin>>node[m].a ;
if(node[m].a ==inf)
return;
node[m].pr =m /2;
node[m].l =m*2;
node[m].r =m*2+1;//记录父节点和左右孩子节点的数组位置;
input(m*2);
input(m*2+1);//递归输入下一层的节点;
}
void pre_ergodic(int m)
{
if(node[m].a ==inf)
return ;//这点判断有无子节点很重要;
cout<<node[m].a<<" ";
pre_ergodic(m*2 );
pre_ergodic(m*2+1 );//先序遍历:根节点、左子树、右子树;
}
void mid_ergodic(int m)
{
if(node[m].a ==inf)
return ;
mid_ergodic(m*2);
cout<<node[m].a<<" ";
mid_ergodic(m*2+1);//中序遍历:左子树、根节点、右子树;
}
void last_ergodic(int m)
{
if(node[m].a ==inf)
return ;
last_ergodic(m*2);
last_ergodic(m*2+1);
cout<<node[m].a<<" ";//后序遍历:左子树、右子树、根节点;
}
int main()
{
//freopen ("a.in","r",stdin);
//freopen ("b.out","w",stdout);
input(1);
cout<<"先序遍历:"<<endl;
pre_ergodic(1);
cout<<endl;
cout<<"中序遍历:"<<endl;
mid_ergodic(1);
cout<<endl;
cout<<"后序遍历:"<<endl;
last_ergodic(1);
cout<<endl;
return 0;
}
这是深搜的三种树的遍历方式的算法介绍。本质上是差不多的,只是对于个别遍历方式和输出方式不同。
说实在的练习深搜很好
qwq本蒟蒻的爬行之旅....各位大佬看到哪里错了或可以改进的地方请指出来,蒟蒻表示十分感谢(*/ω\*)