[数据结构]——遍历二叉树

遍历定义

在这里插入图片描述

遍历方法

二叉树的遍历主要包括前序遍历、中序遍历、后序遍历和层序遍历四种,其中前三种是非常常用的,下面主要介绍前三种遍历的方法。

前序遍历

若二叉树为空,则空操作返回,否则先访问根节点,然后前序遍历左子树,再前序遍历右子树。如下图所示:
在这里插入图片描述

代码:

/*二叉树的前序遍历递归算法*/
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##
测试结果如下:
在这里插入图片描述

最后的话

码的这么累,各位观众给个赞呗!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值