创建完二叉树了,真的猛士就应该开始遍历了!
遍历的种类
二叉树是一种非常重要的数据结构。对于二叉树,存在深度遍历和广度遍历两种类的便利结构。
深度遍历有前序遍历、中序遍历以及后序遍历三种遍历方法,
广度遍历代表的是常见的层次遍历。
对于深度遍历而言,结合树的递归的特点,因此可以使用递归的方法去实现树的三种遍历。
而对于广度遍历而言,需要其他数据结构的支撑。
深度遍历的实现
首先讲解深度遍历的三种遍历方法。
本文使用上一篇blog所生成的树进行讲解。具体树的生成方式可以参照我的上一篇blog:
https://blog.csdn.net/weixin_44791964/article/details/98229328
先序遍历
前序遍历的遍历顺序为:根结点 —> 左子树 —> 右子树
此时对于上述的二叉树而言,其遍历结果为,abcde。
在代码中,先序遍历通过以下方式实现。
void visit(Tree t, int level){
printf("%c位于第%d层\n", t->data, level);
}
void scan(Tree t,int level){
if (t != NULL){
visit(t, level);
scan(t->LeftChild, level + 1);
scan(t->RightChild,level + 1);
}
}
首先遍历根节点,再递归遍历左结点,最后递归遍历右结点。
中序遍历
中序遍历的遍历顺序为:左子树—> 根结点 —> 右子树
此时对于上述的二叉树而言,其遍历结果为,cbaed。
在代码中,中序遍历通过以下方式实现。
void visit(Tree t, int level){
printf("%c位于第%d层\n", t->data, level);
}
void scan(Tree t,int level){
if (t != NULL){
scan(t->LeftChild, level + 1);
visit(t, level);
scan(t->RightChild,level + 1);
}
}
首先递归遍历左结点,再遍历根节点,再最后递归遍历右结点。
后序遍历
后序遍历的遍历顺序为:左子树 —> 右子树 —> 根结点
此时对于上述的二叉树而言,其遍历结果为,cbeda。
在代码中,后序遍历通过以下方式实现。
void visit(Tree t, int level){
printf("%c位于第%d层\n", t->data, level);
}
void scan(Tree t,int level){
if (t != NULL){
scan(t->LeftChild, level + 1);
scan(t->RightChild, level + 1);
visit(t, level);
}
}
首先递归遍历左结点,再递归遍历右结点,再最后遍历根节点。
实现代码
可以通过更改scan函数的代码实现不同的遍历。
#include <stdio.h>
#include <stdlib.h>
typedef char Ele;
struct Node{
Ele data; //data用于存储信息
struct Node* LeftChild;
struct Node* RightChild;
};
typedef struct Node Node, *Tree;
void init(Tree* t){ //当输入的字符为空格的时候,代表叶子结点
//输入其它的字符代表当前结点的data值
//输入顺序为当前结点、左结点、右结点。
Ele c;
scanf("%c", &c);
if (' '== c){
*t = NULL;
}
else{
*t = (Tree)malloc(sizeof(Node));
if (*t == NULL){
printf("内存分配失败");
exit(1);
}
(*t)->data = c;
init(&(*t)->LeftChild); //生成左结点
init(&(*t)->RightChild); //生成右结点
}
}
void visit(Tree t, int level){
printf("%c位于第%d层\n", t->data, level);
}
void scan(Tree t,int level){
if (t != NULL){
scan(t->LeftChild, level + 1);
scan(t->RightChild, level + 1);
visit(t, level);
}
}
int main(){
Tree BiTree = NULL;
init(&BiTree);
scan(BiTree,1);
return 0;
}
先序遍历:
中序遍历:
后序遍历:
GITHUB下载连接
https://github.com/bubbliiiing/Data-Structure-and-Algorithm
希望得到朋友们的喜欢。
有问题的朋友可以提问噢。