树与二叉树

    我们之前讲过的链表和顺序表都是线性结构的数据结构,那么我们肯定会想有没有一种数据结构的形式不是线性结构而是其他的形式呢?今天我们就来学习一种新的数据结构——树形结构。

    🌵初识树形结构  

  树形结构就是像我们上面的图形一样。因为像是一颗倒立的树,越向下(树枝)数据越多所以得名。在我们的树形结构当中有一个特殊的节点也就是最上面的节点。我们所有的节点都是从最上面的节点展开的,所以它叫做我们树的根节点。假如我们将我们的根节点去掉,那么剩下的部分又会组成许多个树,这些树叫做子树。结构形式又和我们原先的形式相同,所以我们的树形结构是由无数个相同的结构组成,因此我们可以使用递归进行树的构建。

     需要注意的是:在树型结构当中每一个子树都是不相交的,每一个节点都只能拥有一个父节点并且N个节点当中都有N-1条边,否则该结构就不是树形结构。 

  就像我们上面三种样例所展示的那样,以上三种结构都不是树形结构。 

    🌵树的相关概念

  还以我们上面的图片中的样例进行学习,我们的树形结构拥有以下的概念:

     🥧节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6

     🥧叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点

     🥧非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G...等节点为分支节点

     🥧双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点

     🥧孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点

     🥧兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点

树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6

     🥧节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;

     🥧树的高度或深度:树中节点的最大层次; 如上图:树的高度为4

     🥧堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点

     🥧节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先

     🥧子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙

     🥧森林:由m(m>0)棵互不相交的树的集合称为森林;

  我们在使用树形结构的时候会使用到上面的名词,所以需要对上述名词的含义具备一定的概念,便于我们后面的学习。

    🌵树形结构的构建

  话题回到我们对于代码的编写,我们树形结构的大致内容出来了,但是我们在编写代码的时候要怎样实现树形结构呢?

  首先来分析一下我们树形结构索要存储的内容。首先肯定要有的就是存储的数据,之后我们在查找树中的数据的时候肯定要查找我们相应的节点,所以我们还需要想办法进行查找同一层次的兄弟节点。那么我们也就有了以下的存储的形式:

  我们可以创建一个结构体,结构体当中存储有我们的孩子节点以及右兄弟节点的指针。 我们可以通过孩子节点找到下一层的数据节点,同样我们还可以通过右兄弟节点查找到我们同一层次的所有的节点。实际上也就是如下的查找形式:

  在我们使用的计算机当中文件的存储和管理使用的都是树形结构。在了解完大致的树形结构之后我们再来介绍一种特殊的树形结构——二叉树。

    🌵二叉树的结构和概念

  在我们的树形结构当中对于子节点的个数并没有进行限制,但是在我们的二叉树当中,我们一棵树的度只能为0,1,2。也就是我们一棵树的最大的度的个数不能超过2。(这也是我们n叉树的定义,最大的度为几就为几叉树)我们将存在的两个节点分别命名为左孩子节点和右孩子节点。二叉树的结构如下所示:

   需要注意的是我们二叉树当中的左右孩子节点的顺序不可以调换,因此我们的二叉树为有序树。同时在我们的二叉树当中可能出现如下的几种情况:   我们的二叉树可以为一棵空树,也可以只有一个根节点,并且允许只存在一个左节点或者右节点。这样的树型结构只要最大的度不超过2,都可以叫做二叉树。

  在我们的二叉树当中有两种特殊的二叉树:满二叉树和完全二叉树。

    🌵满二叉树

  

  当一个二叉树上面每一层的节点都满的时候,这样的二叉树就叫做满二叉树。因为第一层有一个节点之后每一层的节点个数每一次都扩大上一层的两倍,所以我们可以得出每一层的节点个数为2^(h-1),其中h表示层数。我们我们总节点的个数就为:2^h-1。我们对这节点的总数进行推导:

  之后我们可以利用这个公式进行很多关于二叉树的计算,我们需要将节点总数的公式记牢,避免现场推导浪费时间。 

    🌵完全二叉树 

   当我们一个二叉树当中的全部节点都相邻的时候就叫做完全二叉树。这里的相邻是指我们当我们最后一层的节点不满的时候我们的节点必须是一个左节点一个右节点再接着一个左节点......我们可以由一个左节点结束也可以由一个右节点结束。举几个简单的例子来帮助我们理解:

   一上两种情况都不是完全二叉树,因为我们可以发现我们最后一个节点并不是和我们前面的节点紧密相连的。

    🌵二叉树的重要性质

  ⭐对任何一棵二叉树, 如果度为0其叶结点个数为n0, 度为2的分支结点个数为n2,则有n0=n2+1。

  ⭐由节点的总数可以推导出我们二叉树的高度:h=log(n+1)  (底数为2)

  我们可以利用上面两点性质进行对于部分选择题目或者填空题目的解决。

  那么以上就是我们本次博客的主要内容了,感谢您的观看。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿白逆袭记

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

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

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

打赏作者

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

抵扣说明:

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

余额充值