【数据结构】二叉树

文章介绍了二叉树作为一种重要的非线性数据结构,特别是在计算机科学中的应用,如文件目录、语法结构和数据库。二叉树的链式存储结构包括二叉链表和三叉链表,其中结点包含数据域和指向子节点的指针。文章详细阐述了前序、中序和后序遍历二叉树的方法,这些遍历方式是处理二叉树基础且关键的操作。
摘要由CSDN通过智能技术生成

树结构是一类重要的非线性数据结构。直观来看,树是以分支关系定义的层次结构。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树来形象表示。树在计算机领域中也得到广泛应用,尤以二叉树最为常用。如在操作系统中,用树来表示文件目录的组织结构;在编译系统中,用树来表示源程序的语法结构;在数据库系统中,树结构也是信息的重要组织形式之一。本章重点讨论二叉树的存储结构及其各种操作。

二叉树的链式存储结构

设计不同的结点结构可构成不同形式的链式存储结构。由二叉树的定义得知,二叉树的结点由一个数据元素和分别指向其左、右子树的两个分支构成,则表示二叉树的链表中的结点至少包含3个域:数据域和左、右指针域。有时,为了便于找到结点的双亲,还可在结点结构中增加一个指向其双亲结点的指针域。利用这两种结点结构所得二叉树的存储结构分别称为二叉链表和三叉链表。

 

 

typedef char BiTNode
{
    TElemType date;    //结点数据域
    struct BiTNode *lchild, *rchild;    //左右孩子指针
}BiTNode;

遍历二叉树

遍历二叉树是指按某条冬搜索路径巡访树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。访问的含义很广,可以是对结点进行各种处理,包括输出结点的信息,对结点进行运算和修改等。遍历二叉树是二叉树最基本的操作,也是二叉树其他各种操作的基础。遍历的实质是对二叉树进行线性化,即遍历的结果是将非线性结构树中的结点排成一个线性序列。由于二叉树的每个结点都可能有两棵子树,因而需要寻找一种规律,以便使二叉树上的结点能排列在一个线性队列上,从而便于遍历。

  1. 前序遍历
  • 也叫做先序遍历,访问根结点的操作发生在遍历其左右子树之前
  • 遍历顺序:根节点->左子结点->右子结点
void PreOrder(BiTNode *root)
{
    if(root==NULL)
    {
        printf("NULL");
        return;
    }

    printf("%c",root->date);
    PreOrder(root->lchild);
    PreOrder(root->rchild);
}

 2.中序遍历

  • 访问根结点的操作发生在遍历其左右子树之中
  • 遍历顺序:左子结点->根结点->右子结点
void InOrder(BiTNode *root)
{
    if(root==NULL)
    {
        printf("NULL");
        return;
    }
    InOrder(root->lchild);
    printf("%c",root->date);
    InOrder(root->rchild);
}

3.后序遍历

  • 访问根节点的操作发生在遍历其左右子树之后
  • 遍历顺序:左子节点->右子节点->根节点 
void PostOrder(BiTNode *root)
{
    if(root==NULL)
    {
        printf("NULL");
        return;
    }
    
    PostOrder(root->lchild);
    PostOrder(root->rchild);
    printf("%c",root->date);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值