遍历定义
遍历方法
二叉树的遍历主要包括前序遍历、中序遍历、后序遍历和层序遍历四种,其中前三种是非常常用的,下面主要介绍前三种遍历的方法。
前序遍历
若二叉树为空,则空操作返回,否则先访问根节点,然后前序遍历左子树,再前序遍历右子树。如下图所示:
代码:
/*二叉树的前序遍历递归算法*/
void PreOrderTraverse(BiTree T)
{
if(T==NULL)
return;
printf("%c", T->data); /*显示结点数据,可以更改为其他对结点操作*/
PreOrderTraverse(T->lchild); /*再先序遍历左子树*/
PreOrderTraverse(T->rchild); /*最后先序遍历右子树*/
}
中序遍历
若二叉树为空,则空操作返回,否则从根节点开始(注意不是先访问根节点),中序遍历根节点的左子树,然后是访问根节点,最后中序遍历右子树。如下图所示:
代码:
/*二叉树的中序遍历递归算法*/
void InOrderTraverse(BiTree T)
{
if(T==NULL)
return;
InOrderTraverse(T->lchild); /*中序遍历左子树*/
printf("%c", T->data); /*显示结点数据,可以更改为其他对结点操作*/
InOrderTraverse(T->rchild); /*最后中序遍历右子树*/
}
后序遍历
若二叉树为空,则空操作返回,否则从左到右先叶子后节点的方式遍历访问左右子树,最后是访问根节点。
代码:
/*二叉树的中序遍历递归算法*/
void PostOrderTraverse(BiTree T)
{
if(T==NULL)
return;
PostOrderTraverse(T->lchild); /*先后序遍历左子树*/
PostOrderTraverse(T->rchild); /*再后序遍历右子树*/
printf("%c", T->data); /*显示结点数据,可以更改为其他对结点操作*/
}
简单记忆
前序遍历:根->左子树->右子树
中序遍历:左子树->根->右子树
后序遍历:左子树->右子树->根
遍历实例
代码:
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
int max = 0;
struct node {
int data;
struct node* left;
struct node* right;
};
struct node* create(struct node* newNode) {//先序创建二叉树
char data;
scanf("%c", &data);
if (data == '#') {
newNode = NULL;
}
else {
newNode = (struct node*)malloc(sizeof(struct node));
newNode->data = data;
newNode->left = create(newNode->left);
newNode->right = create(newNode->right);
}
return newNode;
}
void PreOrderTraversal(struct node* tree) {//先序遍历
if (tree) {
printf("%c", tree->data);
PreOrderTraversal(tree->left);
PreOrderTraversal(tree->right);
}
}
void InOrderTraversal(struct node* tree) {//中序遍历
if (tree) {
InOrderTraversal(tree->left);
printf("%c", tree->data);
InOrderTraversal(tree->right);
}
}
void PostOrderTraversal(struct node* tree) {//后序遍历
if (tree) {
PostOrderTraversal(tree->left);
PostOrderTraversal(tree->right);
printf("%c", tree->data);
}
}
int main() {
struct node* tree = NULL;
tree = create(tree);
if (tree) {
PreOrderTraversal(tree); printf("\n");
InOrderTraversal(tree); printf("\n");
PostOrderTraversal(tree); printf("\n");
}
else {
printf("NULL");
}
return 0;
}
创建如下图的二叉树:
对于上图所示的二叉树,其先序遍历:ABDEFCG,按照先序遍历构建二叉树,子树为空时输入字符为#,
则构建二叉树输入序列为:ABD##EF###C#G##
测试结果如下:
最后的话
码的这么累,各位观众给个赞呗!