【数据结构与算法】第十章:树和二叉树

简介: 树结构是一类重要的非线性数据结构。树在计算机领域中也得到广泛应用,尤以二叉树最为常用。本章将重点介绍树的结构定义及二叉树的相关操作。

🙊🙊作者主页:🔗求不脱发的博客

📔📔 精选专栏:🔗数据结构与算法

📋📋 精彩摘要:树结构是一类重要的非线性数据结构。树在计算机领域中也得到广泛应用,尤以二叉树最为常用。本章将重点介绍树的结构定义及二叉树的相关操作。

💞💞觉得文章还不错的话欢迎大家点赞👍➕收藏⭐️➕评论💬支持博主🤞


📚目录

📖【数据结构与算法】第十章:树和二叉树

📝1️⃣树

📝2️⃣二叉树


📖【数据结构与算法】第十章:树和二叉树


📝1️⃣树

✨树的定义

树是n(n>=0)个结点的有限集,或为空树,或为非空树。

对于非空树T:

    1. 有且仅有一个称之为根的结点。
    2. 除根结点外,其余结点可分为m个互不相交的有限集T1,T2,...,Tm,其中每个集合本身又是一棵树,称为根结点的子树。

    image.gif编辑

    树的其他表示形式:

    image.gif编辑

    ✨树的基本术语

    image.gif编辑

      1. 结点:数中的一个独立单元。包含一个数据元素及指向其子树的分支。如上图中的A、B、C、D等。
      2. 结点的度:结点拥有的子树树称为结点的度。
      3. 树的度:结点拥有的子树树称为结点的度。
      4. 叶子:度为0的结点称为叶子或终端结点。结点K、L、F、G、M、I、J都是树的叶子。
      5. 森林:指m颗不想交的树的集合(例如删除A后的子树个数)。
      6. 有序树:结点各子树从左至右有序,不能互换(左为第一)。
      7. 无序树:结点各子树可互换位置。
      8. 非终端结点:度不为0的结点称为非终端结点或分支结点。除根结点之外,非终端结点也称为内部结点。
      9. 双亲和孩子:结点的子树的根称为该结点的孩子,相应地,该结点称为孩子的双亲。例如,B的双亲为A,B的孩子有E和F。
      10. 兄弟:同一个双亲的孩子之间互称兄弟。例如,H、I和J互为兄弟。
      11. 祖先:从根到该结点所经分支上的所有结点。例如,M的祖先为A、D和H。
      12. 子孙:以某结点为根的子树中的任一结点都称为该结点的子孙。如B的子孙为E、K、L和F。
      13. 层次:结点的层次从根开始定义起,根为第一层,根的孩子为第二层。树中任一结点的层次等千其双亲结点的层次加l。
      14. 堂兄弟:双亲在同一层的结点互为堂兄弟。例如,结点G与E、F、H、I、J互为堂兄弟。

      ✨树的抽象数据类型定义

      根据树的结构定义,加上树的一组基本操作就构成了树的抽象数据类型定义:

      ADT Tree{ 
          数据对象D:D是具有相同特性的数据元素的集合。
          数据关系R:若D为空集,则称为空树;
      } ADT Tree;

      image.gif

      基本操作:

             InitTree(&T)

                 操作结果:构造空树T。

             DestroyTree (&T)

                 初始条件:树T存在。

                 操作结果:销毁树T。

             CreateTree(&T,definition)

                 初始条件:defini巨on给出树T的定义。

                 操作结果:按defini巨on构造树T。

             ClearTree(&T)

                 初始条件:树T存在。

                 操作结果:将树T清为空树。TreeEmpty(T)

             TreeEmpty(T)

                 初始条件:树T存在。

                 操作结果:若T为空树,则返回true,否则false。

             TreeDepth(T)

                 初始条件:树T存在。

                 操作结果:返回T的深度。

             Root(T)

                 初始条件:树T存在。

                 操作结果:返回T的根。

             Value(T,cur_e)

                 初始条件:树T存在,cur_e是T中某个结点。

                 操作结果:返回cur_e的值。

             Assign(T,cur_e,value)

                 初始条件:树T存在,cur_e是T中某个结点。

                 操作结果:结点cur_e赋值为value。

             Parent(T,cur_e);

                 初始条件:树T存在,cur_e是T中某个结点。

                 操作结果:若cur_e是T的非根结点,则返回它的双亲,否则函数值为“空”。

             LeftChild(T,cur_e)

                 初始条件:树T存在,cur_e是T中某个结点。

                 操作结果:若cur_e是T的非叶子结点,则返回它的最左孩子,否则返回“空”。

             RightSibling(T,cur_e)

                 初始条件:树T存在,cur_e是T中某个结点。

                 操作结果:若cur_e有右兄弟,则返回它的右兄弟,否则函数值为“空”。

             InsertChild(&T,p,i,c)

                 初始条件:树T存在,p指向T中某个结点,1,;;i所指结点的度+1, 非空树c与T不相交。

                 操作结果:插入c为T中p指结点的第l.棵子树

             DeleteChild(&T,p,i)

                 初始条件:树T存在,p指向T中某个结点,1,;;i指结点的度。

                 操作结果:删除T中p所指结点的第l.棵子树

             TraverseTree(T)

                 初始条件:树T存在。

                 操作结果:按某种次序对T的每个结点访问一次。

      📝2️⃣二叉树

      ✨二叉树的定义

      二叉树树是n(n>=0)个结点的有限集,或为空树,或为非空树。

      基本特点:

        1. 结点的度小于等于2。
        2. 有序树(子树有序,不能颠倒)。

        对于非空二叉树T:

          1. 有且仅有一个称之为根的结点;
          2. 除根结点以外的其余结点分为两个互不相交的子集T1和T2,分别称为T的左子树和右子树,且T1和T2本身又都是二叉树。

          二叉树与树一样具有递归性质,二叉树与树的区别主要有以下两点:

            1. 二叉树每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点);
            2. 二叉树的子树有左右之分,其次序不能任意颠倒。

            image.gif编辑

             ✨二叉树的抽象数据类型定义

            ADT BinaryTree{ 
                数据对象D:D是具有相同特性的数据元素的集合。
                数据关系R:
            } ADT BinaryTree;

            image.gif

            基本操作P:

                   InitBiTree(&T)

                       操作结果:构造空二叉树T。

                   DestroyBiTree(&T)

                       初始条件:二叉树T存在。

                       操作结果:销毁二叉树T。

                   Crea七eBiTree(&T,definition)

                       初始条件;definition给出二叉树T的定义。

                       操作结果:按definition构造二叉树T。

                   ClearBiTree(&T)

                       初始条件:二叉树T存在。

                       操作结果:将二叉树T清为空树。

                   BiTreeEmpty(T)

                       初始条件:二叉树T存在。

                       操作结果:若T为空二叉树,则返回true,否则false。

                   BiTreeDepth (T)

                       初始条件:二叉树T存在。

                       操作结果:返回T的深度。

                   Root(T)

                       初始条件:二叉树T存在。

                       操作结果:返回T的根。

                   Value(T,e)

                       初始条件:二叉树T存在,e是T中某个结点。

                       操作结果:返回e的值。

                   Assign(T,&e,value)

                       初始条件:二叉树T存在,e是T中某个结点。

                       操作结果:结点e赋值为value。

                   Parent(T,e)

                       初始条件:二叉树T存在,e是T中某个结点。

                       操作结果:若e是T的非根结点,则返回它的双亲,否则返回“空”。

                   LeftChild(T,e)

                       初始条件:二叉树T存在,e是T中某个结点。

                       操作结果:返回e的左孩子。若e无左孩子,则返回“空”。

                   RightChild(T,e)

                       初始条件:二叉树T存在,e是T中某个结点。

                       操作结果:返回e的右孩子。若e无右孩子,则返回“空”。

                   LeftSibling (T, e)

                       初始条件:二叉树T存在,e是T中某个结点。

                       操作结果:返回e的左兄弟。若e是T的左孩子或无左兄弟,则返回“空”。

                   RightSibling(T,e)

                       初始条件:二叉树T存在,e是T中某个结点。

                       操作结果:返回e的右兄弟。若e是T的右孩子或无右兄弟,则返回“空”。

                   InsertChild(&T,p,LR,c)

                       初始条件:二叉树T存在,p指向T中某个结点,LR为0或1,非空二叉树c与T不相交且右子树为空。

                       操作结果:根据LR为0或1,插入c为T中p所指结点的左或右子树。p所指结点的原有左或右子树成        为c的右子树。

                   DeleteChild (&T, p, LR)

                       初始条件:二叉树T存在,p指向T中某个结点,LR为0或1。

                       操作结果:根据LR为0或1,删除T中p所指结点的左或右子树。

                   PreOrderTraverse(T}

                       初始条件:二叉树T存在。

                       操作结果:先序遍历T,对每个结点访问一次。

                   InOrderTraverse(T)

                       初始条件:二叉树T存在。

                       操作结果:中序遍历T,对每个结点访问一次。

                   PostOrderTraverse(T}

                       初始条件:二叉树T存在。

                       操作结果:后序遍历T,对每个结点访问一次5

                   LevelOrderTraverse(T)

                       初始条件:二叉树T存在。

                       操作结果:层序遍历T,对每个结点访问一次。

             ✨二叉树的性质

              1. 在二叉树的第i层上最多有2^(i-1)个结点。
              2. 深度为k的二叉树至多有2^k-1个结点。
              3. 对于任何一颗二叉树,若2度的结点数1有n2个则叶子数n0必定为n2+1。(即 n0 = n2 + 1)
              4. 具有n个结点的完全二叉树的深度必为[log2n]+1。
              5. 对完全二叉树,若从上至下、从左至右编号,则编号为i 的结点,其左孩子编号必为2i,其右孩子编号必为2i+1;其双亲的编号必为i/2。

              对此有如下定义:

              image.gif编辑image.gif编辑

                                   (满二叉树 )                                        (完全二叉树)            

              满二叉树:一棵深度为k 且有2k -1个结点的二叉树。(特点:每层都“充满”了结点

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

              满二叉树与完全二叉树的区别:

              满二叉树是叶子一个也不少的树,而完全二叉树虽然前n-1层是满的,但最底层却允许在右边缺少连续若干个结点。满二叉树是完全二叉树的一个特例。

              相关文章
              |
              1月前
              |
              存储 算法 C语言
              "揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
              【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
              49 1
              |
              14天前
              |
              存储 机器学习/深度学习
              【数据结构】二叉树全攻略,从实现到应用详解
              本文介绍了树形结构及其重要类型——二叉树。树由若干节点组成,具有层次关系。二叉树每个节点最多有两个子树,分为左子树和右子树。文中详细描述了二叉树的不同类型,如完全二叉树、满二叉树、平衡二叉树及搜索二叉树,并阐述了二叉树的基本性质与存储方式。此外,还介绍了二叉树的实现方法,包括节点定义、遍历方式(前序、中序、后序、层序遍历),并提供了多个示例代码,帮助理解二叉树的基本操作。
              38 13
              【数据结构】二叉树全攻略,从实现到应用详解
              |
              9天前
              |
              C语言
              数据结构基础详解(C语言):图的基本概念_无向图_有向图_子图_生成树_生成森林_完全图
              本文介绍了图的基本概念,包括图的定义、无向图与有向图、简单图与多重图等,并解释了顶点度、路径、连通性等相关术语。此外还讨论了子图、生成树、带权图及几种特殊形态的图,如完全图和树等。通过这些概念,读者可以更好地理解图论的基础知识。
              |
              11天前
              |
              存储 算法 C语言
              数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
              本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
              |
              11天前
              |
              存储 机器学习/深度学习 C语言
              数据结构基础详解(C语言): 树与二叉树的基本类型与存储结构详解
              本文介绍了树和二叉树的基本概念及性质。树是由节点组成的层次结构,其中节点的度为其分支数量,树的度为树中最大节点度数。二叉树是一种特殊的树,其节点最多有两个子节点,具有多种性质,如叶子节点数与度为2的节点数之间的关系。此外,还介绍了二叉树的不同形态,包括满二叉树、完全二叉树、二叉排序树和平衡二叉树,并探讨了二叉树的顺序存储和链式存储结构。
              |
              11天前
              |
              存储 C语言
              数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
              本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
              |
              1月前
              |
              算法
              【初阶数据结构篇】二叉树算法题
              二叉树是否对称,即左右子树是否对称.
              |
              1月前
              |
              存储
              【初阶数据结构篇】实现链式结构二叉树(二叉链)下篇
              要改变root指针的指向,将本来指向根节点的root指针改为空,所以传二级指针(一级指针也可以,只不过在调用完记得把root置为空)。
              |
              3月前
              |
              算法 C++ Python
              数据结构与算法===贪心算法
              数据结构与算法===贪心算法
              |
              3月前
              |
              算法 Java
              Java数据结构与算法:最短路径算法
              Java数据结构与算法:最短路径算法