0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

二叉树,一种基础的数据结构类型

8g3K_AI_Thinker 来源:lp 2019-04-13 10:48 次阅读

作为数据结构的基础,树分很多种,像AVL树、红黑树、二叉搜索树....今天我想分享的是关于二叉树,一种基础的数据结构类型。

01

什么是树

在《数据结构》[注1]中树有如下定义:

树是 n(n≥0) 个结点的有限集

在此我对上述定义做出如下解释:

当n=0n=0时,为空树,树的深度与高度均为00,是树的一种特例;当n>0n>0时,为非空树,树的第一个结点,即深度为11的结点,我们称其为根结点,由根结点可以引出若干子树分支,同时子树分支可依此向下延伸,此时树的深度与高度也在变化,即树状图。

这里我们需要厘清树的深度与树的高度与其他树的术语:

树的深度:树中结点的最大层次

树的高度:从叶子结点开始定义,叶子结点为第一层,往上依次递增,直至根结点。

结点:树的结点包含一个数据元素以及若干指向其子树的分支

度:结点所拥有的子树数量

终端节点:度为0的结点称为叶子结点或终端结点

树的度:树中各结点度的最大值

层次:从根开始定义,根为第一层,依次递增

有序树:树中结点的各子树从左往右是有次序的,不可相互交换;反之则是无序树

森林:一棵非空树删掉根结点,即是森林

02

二叉树的概念引入

二叉树是由树演化而来的一种数据结构,上面所有术语均适用于二叉树。二叉树与树不同之处在于,树的每一个结点(除终端结点外)允许有若干子树分支;而二叉树只允许有左右两个子树分支,即不存在度大于2结点。

C语言示例:

上面的示例清晰地阐明了二叉树的结点是由一个数据元素和两个子树分支构成,需要明确的是,虽然终端结点没有指向任何子树,但它仍旧有往下繁衍的能力。

除此之外,二叉树还是一棵有序树,它的各个结点从左到右是依次有序可循的,且不可交换;它具有以下五种形态:

空树

仅有根结点

左子树为空

右子树为空

左右子树均非空

当二叉树处于第五种状态,且设树的深度为n,总结点数为 时,我们称其为满二叉树。

‍‍事实上还有另外一种也处于第五状态的树——完全二叉树。由于完全二叉树的定义在每个版本的教科书中均不相同,而笔者只接触过《数据结构·严蔚敏版》,因此摘录此书中对完全二叉树的定义:

深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称之为完全二叉树。

这段描述我读了两遍,方才理解其中的深刻含义,我们把深度为3的满二叉树的每个结点从上往下,从左往右进行编号:‍‍

然后我们再定义一棵深度也为3的二叉树,该二叉树的n 个结点(n≤7),当从1到n的每个结点都与上图中的编号结点一一对应时,这二叉树就称为完全二叉树。

举个例子,当n=5时:

这便是完全二叉树。

因此我们还可以得到一个推论:满二叉树是完全二叉树,但完全二叉树不一定是满二叉树。

当二叉树处于第三种状态时,称其为右斜树。

同理,处于第四状态为左斜树。

‍‍‍‍03

二叉树的性质总结

二叉树的第i 层上最多有个结点。此性质可通过上面满二叉树的图示推得

深度为n 的二叉树,最多拥有 个结点。此性质可以通过数列求和得出:

设满二叉树深度为 n,叶子结点数必为

设任意一棵二叉树的叶子结点数为n0,度为1的结点数为n1,度为2的结点数为n2;总结点数为n。则有:

设分支的总边数为x,则有:

联立上述三式可得:

即任意二叉树的叶子结点数为该树中度为2的结点数的总和加一。

设一完全二叉树具有n个结点,则其深度必为,[x] 表示不大于 x 的最大整数,即向下取整。

04

手把手建立二叉树

C语言示例:

其中需要指明的是二叉树的三种遍历方法:先序遍历、中序遍历、后序遍历。

先序遍历

即遍历顺序为“根—>左->右”。

中序遍历

即遍历顺序为“左—>根—>右”,由于二叉树为有序树,因此中序遍历输出的值由小到大的。

后序遍历

即遍历顺序为“左—>右—>根”。

还有一种遍历法,称为层序遍历,有兴趣的读者可以尝试着写一下。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据结构
    +关注

    关注

    3

    文章

    572

    浏览量

    40080
  • 二叉树
    +关注

    关注

    0

    文章

    74

    浏览量

    12307

原文标题:二叉树的原理推敲与动手种树

文章出处:【微信号:AI_Thinker,微信公众号:人工智能头条】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于二叉树的时序电路测试序列设计

    为了实现时序电路状态验证和故障检测,需要事先设计个输入测试序列。基于二叉树节点和树枝的特性,建立时序电路状态二叉树,按照电路二叉树节点(状态)与树枝(输入)的层次逻辑
    发表于 07-12 13:57 0次下载
    基于<b class='flag-5'>二叉树</b>的时序电路测试序列设计

    二叉树层次遍历算法的验证

    实现二叉树的层次遍历算法,并对用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”创建的二叉树进行测试。
    发表于 11-28 01:05 2074次阅读
    <b class='flag-5'>二叉树</b>层次遍历算法的验证

    关于二叉树数据结构和算法相关的题目

    最近总结了数据结构和算法相关的题目,这是第篇文章,关于二叉树的。
    的头像 发表于 02-07 13:57 3172次阅读

    4中二叉树的遍历方式介绍

    对于一种数据结构而言,遍历是常见操作。二叉树一种基本的数据结构,是一种每个节点的儿子数目都不多于2的
    的头像 发表于 04-27 17:23 4731次阅读
    4中<b class='flag-5'>二叉树</b>的遍历方式介绍

    详解电源二叉树到底是什么

    作为数据结构的基础,分很多种,像 AVL 、红黑二叉搜索....今天我想分享的是关于
    的头像 发表于 06-06 15:05 9945次阅读
    详解电源<b class='flag-5'>二叉树</b>到底是什么

    红黑(Red Black Tree)是一种自平衡的二叉搜索

    平衡(Balance):就是当结点数量固定时,左右子树的高度越接近,这棵二叉树越平衡(高度越低)。而最理想的平衡就是完全二叉树/满二叉树,高度最小的二叉树
    的头像 发表于 07-01 15:05 5617次阅读
    红黑<b class='flag-5'>树</b>(Red Black Tree)是<b class='flag-5'>一种</b>自平衡的<b class='flag-5'>二叉</b>搜索<b class='flag-5'>树</b>

    二叉树操作的相关知识和代码详解

    数据结构中的重中之重,尤其以各类二叉树为学习的难点。在面试环节中,二叉树也是必考的模块。本文主要讲二叉树操作的相关知识,梳理面试常考的内
    的头像 发表于 12-12 11:04 2014次阅读
    <b class='flag-5'>二叉树</b>操作的相关知识和代码详解

    二叉树的前序遍历非递归实现

    通过下面这个动画复习二叉树的前序遍历。 迭代遍历 我们试想下,之前我们借助队列帮我们实现二叉树的层序遍历, 那么可不可以,也借助数据结构
    的头像 发表于 05-28 13:59 1917次阅读

    数据结构与算法分析中的二叉树与堆有关知识汇总

    该资料包括数据结构与算法分析中的二叉树与堆有关的些知识
    发表于 11-03 09:37 0次下载

    C语言数据结构:什么是二叉树

    完全二叉树:完全二叉树是效率很高的数据结构。对于深度为K,有n个节点的二叉树,当且仅当每个节点都与深度为K的满
    的头像 发表于 04-21 16:20 2428次阅读

    怎么就能构造成二叉树呢?

    直跟着公众号学算法的录友 应该知道,我在二叉树:构造二叉树登场!,已经讲过,只有 中序与后序 和 中序和前序 可以确定颗唯
    的头像 发表于 07-14 11:20 1499次阅读

    使用C语言代码实现平衡二叉树

    这篇博客主要总结平衡二叉树,所以,二叉排序树知识不会提及,但是会用到。
    的头像 发表于 09-21 11:00 1038次阅读

    二叉树的代码实现

    二叉树的主要操作有遍历,例如有先序遍历、中序遍历、后序遍历。在遍历之前,就是创建二叉树,当然,还需要有删除二叉树的算法。
    的头像 发表于 01-18 10:41 1197次阅读
    <b class='flag-5'>二叉树</b>的代码实现

    C++构建并复制二叉树

    使用C++构建二叉树并复制、输出。
    的头像 发表于 01-10 15:17 983次阅读
    C++构建并复制<b class='flag-5'>二叉树</b>

    C++自定义二叉树并输出二叉树图形

    使用C++构建二叉树并输出。
    的头像 发表于 01-10 16:29 1685次阅读
    C++自定义<b class='flag-5'>二叉树</b>并输出<b class='flag-5'>二叉树</b>图形