二叉树练习——树的遍历

二叉树练习——树的遍历

哈喽,大家好,我是赏月君,今天做二叉树的练习——树的遍历,废话少说,上题目。
题目描述
请根据下述算法编写一个程序,系统地访问给定二叉树的所有节点。
1.按照根结点、左子树、右子树的顺序输出结点编号。这称为树的前序遍历( Preorder Tree Walk )。
2.按照左子树、根结点、右子树的顺序输出结点编号。这称为树的中序遍历( Inorder Tree Walk )。
3.按照左子树、右子树、根结点的顺序输出结点编号。这称为树的后序遍历( Postorder Tree Walk )。
设给定二叉树拥有n个结点,编号分别为0至n-1。
输入
输入第1行输人结点的个数n。 接下来n行按照下述格式输人各结点的信息,每个结点占1行。
id left right
id为结点编号,left 为左子结点编号,right 为右子结点编号。不存在子结点时lefi (right) 为- 1。
输出
输出第1行输出“Preorder", 第2行按前序遍历的顺序输出结点编号。
第三行输出"Inorder”, 第4行按中序遍历的顺序输出结点编号。
第五行输出"Postorder", 第6行按后序遍历的顺序输出结点编号。
结点编号前输出1个空格。
限制
1≤n≤25
样例输入

9
0 1 4
1 2 3
2 -1 -1
3 -1 -1
4 5 8
5 6 7
6 -1 -1
7 -1 -1
8 -1 -1

二叉树练习——树的遍历_第1张图片

样例输出

Preorder
0 1 2 3 4 5 6 7 8
Inorder
2 1 3 0 6 5 7 4 8
Postorder
2 3 1 6 7 5 8 4 0

题目思路
通过前序遍历、中序遍历、后序遍历三个函数,实现题目要求。

C++代码实现

#include
#define MAX 25
#define NIL -1
using namespace std;
//利用结构体
struct Node{
	int p,l,r;//父结点,左子结点,右子结点
};
struct Node T[MAX];
int n;
//前序遍历
void preParse(int u){
	if(u==NIL)return;//找不到就返回
	printf(" %d",u);//打印
	preParse(T[u].l);//向左找
	preParse(T[u].r);//向右找
}
//中序遍历
void inParse(int u){
	if(u==NIL)return;//找不到就返回
	inParse(T[u].l);//向左找
	printf(" %d",u);//打印
	inParse(T[u].r);//向右找
}
//后序遍历
void posParse(int u){
	if(u==NIL)return;//找不到就返回
	posParse(T[u].l);//向左找
	posParse(T[u].r);//向右找
	printf(" %d",u);//打印
}
int main(){
	int i,v,l,r,root;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		T[i].p=NIL;//初始化
	}
	for(i=0;i<n;i++){
		scanf("%d %d %d",&v,&l,&r);
		T[v].l=l;//左子结点
		T[v].r=r;//右子结点
		if(l!=NIL)T[l].p=v;//父结点
		if(r!=NIL)T[r].p=v;//父结点
	}
	for(i=0;i<n;i++){
		if(T[i].p==NIL){
			root=i;//找到根结点
		}
	}
	//开始遍历打印
	printf("Preorder\n");
	preParse(root);
	printf("\n");
	printf("Inorder\n");
	inParse(root);
	printf("\n");
	printf("Postorder\n");
	posParse(root);
	printf("\n");
}

OK,解决了。

你可能感兴趣的:(二叉树,c++,链表,二叉树,c++,算法,数据结构)