二叉树的遍历

基本操作:

void CreatTree(TreeNode **T,char *data,int *index);    //创建二叉树
void PreOrder(TreeNode *T);     //前序遍历结点
void InOrder(TreeNode *T);     //中序遍历结点
void PostOrder(TreeNode *T);     //后序遍历结点

定义结构体:

#include <stdio.h>
#include <windows.h>

typedef struct TreeNode
{
    char val;		//存储数据
    struct TreeNode *lchild;	//左孩子
    struct TreeNode *rchild;	//右孩子
}TreeNode;

创建二叉树:

void CreatTree(TreeNode **T,char *data,int *index)
{
    char ch;
    ch = data[*index];
    *index += 1;
    if(ch == '#')
    {
        //此时为空结点
        *T = NULL;
    }
    else
    {
        //非空结点
        *T = (TreeNode *)malloc(sizeof(TreeNode));
        (*T)->val = ch;	//存储传入的数据
        //创建左子树
        CreatTree(&((*T)->lchild),data,index);
        //创建右子树
        CreatTree(&((*T)->rchild),data,index);
    }
}

前序遍历:

//前序遍历:根-左-右
//      先访问根结点,
//      再判断是否存在左子树,若存在则递归前序遍历
//      若不存在左子树时则判断是否存在右子树,若存在则递归前序遍历
void PreOrder(TreeNode *T)
{
    if(T == NULL)
        return ;
    
    printf("%c\t",T->val);
    PreOrder(T->lchild);
    PreOrder(T->rchild);
}

中序遍历:

//中序遍历:左-根-右
void InOrder(TreeNode *T)
{
    if(T == NULL)
        return ;

    InOrder(T->lchild);
    printf("%c\t",T->val); 
    InOrder(T->rchild);
}

后序遍历:

//后序遍历:左-右-根
void PostOrder(TreeNode *T)
{
    if(T == NULL)
        return ;
    
    PostOrder(T->lchild);
    PostOrder(T->rchild);
    printf("%c\t",T->val);
}

测试:

void main()
{
    TreeNode *tree;
    int index = 0;	//辅助利用data数组创建二叉树
    char *data = "ABD##E##CF##G##";
    printf("创建二叉树:\n");
    CreatTree(&tree,data,&index);
    printf("先序遍历:\n");
    PreOrder(tree);
    printf("\n");
    printf("中序遍历:\n");
    InOrder(tree);
    printf("\n");
    printf("后序遍历:\n");
    PostOrder(tree);
    printf("\n");

    system("pause");
    return ;
}

测试结果:

在这里插入图片描述

创建的二叉树图示:

在这里插入图片描述

前序遍历图解分析:

在这里插入图片描述
声明:此文章为学习笔记,如有侵权请联系删除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Byte_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值