二叉树的三种遍历方法
最近跟着B站的视频又看了一遍数据结构,想把梳理的东西写下来,便于复习。
二叉树的遍历有 先序遍历、中序遍历、后序遍历。
以下图为例,总结该二叉树的三种遍历方法。
先序遍历
先序遍历的原则是:先根、再左、再右。
即:ABCDEFGH
#define _CRT_SECURE_NO_WARNINGS
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
//定义二叉树节点
struct BinaryNode
{
char ch; //表示字母
struct BinaryNode *lChild; //左孩子
struct BinaryNode *rChild; //右孩子
};
void recursion(struct BinaryNode *root)
{
if(root==NULL)
{
return;
}
//先序遍历
//先根
printf("%c\n",root->ch);
//再左
recursion(root->lChild);
//再右
recursion(root->rChild);
}
void test01()
{
//创建节点
struct BinaryNode nodeA = {'A',NULL,NULL};
struct BinaryNode nodeB = {'B',NULL,NULL};
struct BinaryNode nodeC = {'C',NULL,NULL};
struct BinaryNode nodeD = {'D',NULL,NULL};
struct BinaryNode nodeE = {'E',NULL,NULL};
struct BinaryNode nodeF = {'F',NULL,NULL};
struct BinaryNode nodeG = {'G',NULL,NULL};
struct BinaryNode nodeH = {'H',NULL,NULL};
//建立节点间的关系
nodeA.lChild=&nodeB;
nodeA.rChild=&nodeF;
nodeB.rChild=&nodeC;
nodeC.lChild=&nodeD;
nodeC.rChild=&nodeE;
nodeF.rChild=&nodeG;
nodeG.lChild=&nodeH;
//递归 实现先序遍历
recursion(&nodeA);
}
int main()
{
test01();
system("pause");
return EXIT_SUCCESS;
}
运行结果如下:
中序遍历
中序遍历的原则是:先左、再根、再右。
即:BDCEAFHG
#define _CRT_SECURE_NO_WARNINGS
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
//二叉树节点
struct BinaryNode
{
char ch; //表示字母
struct BinaryNode *lChild; //左孩子
struct BinaryNode *rChild; //右孩子
};
void recursion(struct BinaryNode *root)
{
if(root==NULL)
{
return;
}
//中序遍历
//先左
recursion(root->lChild);
//再根
printf("%c\n",root->ch);
//再右
recursion(root->rChild);
}
void test01()
{
//创建节点
struct BinaryNode nodeA = {'A',NULL,NULL};
struct BinaryNode nodeB = {'B',NULL,NULL};
struct BinaryNode nodeC = {'C',NULL,NULL};
struct BinaryNode nodeD = {'D',NULL,NULL};
struct BinaryNode nodeE = {'E',NULL,NULL};
struct BinaryNode nodeF = {'F',NULL,NULL};
struct BinaryNode nodeG = {'G',NULL,NULL};
struct BinaryNode nodeH = {'H',NULL,NULL};
//建立节点间的关系
nodeA.lChild=&nodeB;
nodeA.rChild=&nodeF;
nodeB.rChild=&nodeC;
nodeC.lChild=&nodeD;
nodeC.rChild=&nodeE;
nodeF.rChild=&nodeG;
nodeG.lChild=&nodeH;
//递归 实现中序遍历
recursion(&nodeA);
}
int main()
{
test01();
system("pause");
return EXIT_SUCCESS;
}
运行结果如下:
后序遍历
后序遍历的原则是:先左、再右、再根。
即:DECBHGFA
#define _CRT_SECURE_NO_WARNINGS
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
//二叉树节点
struct BinaryNode
{
char ch; //显示字母
struct BinaryNode *lChild; //左孩子
struct BinaryNode *rChild; //右孩子
};
void recursion(struct BinaryNode *root)
{
if(root==NULL)
{
return;
}
//后序遍历
//先左
recursion(root->lChild);
//再右
recursion(root->rChild);
//再根
printf("%c\n",root->ch);
}
void test01()
{
//创建节点
struct BinaryNode nodeA = {'A',NULL,NULL};
struct BinaryNode nodeB = {'B',NULL,NULL};
struct BinaryNode nodeC = {'C',NULL,NULL};
struct BinaryNode nodeD = {'D',NULL,NULL};
struct BinaryNode nodeE = {'E',NULL,NULL};
struct BinaryNode nodeF = {'F',NULL,NULL};
struct BinaryNode nodeG = {'G',NULL,NULL};
struct BinaryNode nodeH = {'H',NULL,NULL};
//建立节点间的关系
nodeA.lChild=&nodeB;
nodeA.rChild=&nodeF;
nodeB.rChild=&nodeC;
nodeC.lChild=&nodeD;
nodeC.rChild=&nodeE;
nodeF.rChild=&nodeG;
nodeG.lChild=&nodeH;
//递归 实现后序遍历
recursion(&nodeA);
}
int main()
{
test01();
system("pause");
return EXIT_SUCCESS;
}
运行结果如下:
有错误的地方欢迎批评指正~