图的三种深搜遍历

作为一个立志要好好学习的蒟蒻,搜集了好多关于数据结构的资料。对于树的遍历这点,看网上那帮大佬的指针做法,不禁瑟瑟发抖。其实对于指针的做法,我们可以用数组来模拟指针,效率也是很快。

二叉树的三种深搜遍历分为先序遍历、中序遍历和后序遍历。

先序遍历:先遍历根节点,然后左子树,最后右子树【根左右】

中序遍历:先遍历左子树,然后根节点,最后右子树【左根右】

后序遍历:先遍历左子树,然后右子树,最后根节点【左右根】

如下图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本蒟蒻的爬行之旅....各位大佬看到哪里错了或可以改进的地方请指出来,蒟蒻表示十分感谢(*/ω\*)

猜你喜欢

转载自blog.csdn.net/MYC_TYfor/article/details/81482599
今日推荐