数据结构浅浅析之(三)——树(Tree)(上篇——基础知识 附C++代码)

本文深入浅出地介绍了树数据结构的基础知识,包括树的定义、结点分类、结点间关系以及相关概念,对比了线性结构和树结构。特别详细讲解了二叉树的概念、特性、满二叉树、完全二叉树以及四种遍历方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一.引言

二.基础知识

 树(tree)的定义

在任意一棵非空树中存在以下特性:

注意几点:

结点的分类

结点间的关系

其他相关概念

线性结构和树结构的比较

三.最简单的树——二叉树(Binary Tree)

满二叉树

完全二叉树

二叉树的遍历

         1.前序遍

         2.中序遍历

3.后序遍历

4.层次遍历


一.引言

        俗话说:“十年树木,百年树人”,可一棵参天大树又何止十年光阴。不管是绿荫一圆的小苗亦或是天然氧吧的“绿肺”,都是从小到大,从根到茎,从茎到叶一步步成长起来的。所以,“珍爱“生命”,不乱砍乱伐”。言归正传,本篇文章将浅析一种新的数据结构——树(tree)

之前我们所浅析的不管是线性表,还是栈,亦或是队列,都是一种一对一的线性结构,可现实中,还存在一对多的数据需要处理,所以我们以一种新的数据结构——树(tree)来解决此类问题。

二.基础知识

  •  树(tree)的定义

  •   树(tree)是n(n>=0)个ji结点的有限集合。当n = 0时我们称之为空树

                                                                                                  树 

  • 在任意一棵非空树中存在以下特性:

  • 有且仅有一个特定的根节点(Root)

  • 当n > 1时,其余结点可分为m(m > 0)个互不相交的有限集T1、T2、……Tm,其中每一个集合本身又是一棵树,并且称为树的子树(SubTree),如图所示:

                                                                                                                子树 

子树T1和T2属于树A的子树,同时,D,G,H,I组成的树又是B为结点的子树。 

  • 注意几点:

        1.当n > 0 时根节点是唯一的,不可能存在多个根节点,只存在唯一的一个根节点

        2.当m > 0 时,子树的个数没有限制,但他们一定是相互不相交的。如图所示的结构就不符合树的定义,因为他们相交有xi相交的子树。

                                                                                        相交的结构不构成树 

  • 结点的分类

        树的结点包含一个数据元素及若干指向其子树的分支。结点拥有的子树数称为结点的度(Degree)。度为0的结点称为叶结点(Leaf)或终端结点;度不为0的结点称为非终端结点或分支结点。除根节点之外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。如下图所示,因为这棵树结点的度的最大值是结点D的度,为3,则树的度也是3。

                                                                                      结点的分类 

  • 结点间的关系

        节点的子树的根称为该结点的孩子(Child),相应的,该结点称为孩子的双亲(Parent)。(父母同体)。同一个双亲的孩子之间互称兄弟(Sibbling)。结点的祖先是从根节点到该结点所经分支上的所有结点。所以对于结点H来说,D、B、A都是它的祖先。如图所示:

                                                                                                               结点间关系 

  • 其他相关概念

              结点的层次(Level)从根节点开始定义,根为第一层,根的孩子为第二层。其双亲在同一层的结点互称为堂兄弟。如下图中的D、E、F为堂兄弟。树中结点的最大层次称为树的深度(Depth)或高度,当前树的深度为4。

                                                                                             树的层次 

如果将树中结点的各子树看成从左至右是有次序的,不能互换的,则称该树为有序树,否则为无序树

森林(Forest)是m ( m > = 0 )棵树互不相交的树的集合。

  • 线性结构和树结构的比较

                      线性结构

                         树结构

  • 第一个数据元素:无前驱

  • 最后一个数据元素:无后继

  • 中间元素:一个前驱,一个后继

  • 根节点:无双亲,唯一

  • 叶结点:无孩子,可以多个

  • 中间结点:一个双亲多个孩子

三.最简单的树——二叉树(Binary Tree)

         二叉树(Binary Tree)是n(n >= 0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根节点和两棵互不相交的、分别称为根节点的左子树右子树的二叉树组成。

  • 二叉树的特点

  •  每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。

  • 左子树和右子树是有顺序的,次序不能任意颠倒

  • 即使树中某结点至右一棵子树,也要区分它是左子树还是右子树

  • 满二叉树

        在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树

                                                                                                                  满二叉树 

  • 完全二叉树

      对一棵具有n个结点的二叉树按层序编号,如果编号为i(1<i<n)的结点与同样深度的满二叉树中的编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树

                                                                                                             完全二叉树 

  • 二叉树的遍历

      二叉树的遍历(traversing binary tree)是指从根节点出发,按照某种次序依次访问二叉树中所有的结点,使得每个结点被访问一次且仅被访问一次。

      1.前序遍历

若二叉树为空,则返回,否则先访问根节点,然后前序遍历左子树,在前序遍历右子树。如图的遍历顺序为:ABDGHCEIF。

                                                                                                               前序遍历 

     2.中序遍历

若二叉树为空,则返回,否则从根节点开始(注意并不是先访问根节点),中序遍历根节点的左子树,然后是访问根节点,最后中序遍历右子树。如图的遍历顺序为:GDHBAEICF

                                                                                                                中序遍历 

3.后序遍历

    若二叉树为空,则返回,否则从左至右先叶子后结点的方式遍历访问左右子树,最后访问根节点。如图所示遍历顺序为:GHDBIEFCA。

                                                                                                                 后序遍历 

4.层次遍历

    若树为空,则返回,否则从树的第一层开始访问,在同一层中,按从左至右的顺序对结点逐个进行访问。如图所示遍历顺序为:ABCDEFGHI。

                                                                                                               层次遍历

【上一篇:】数据结构浅浅析之(二)——栈和队列(Stack && Queue):

https://blog.youkuaiyun.com/weixin_39951988/article/details/86518425

【下一篇:】数据结构浅浅析之(三)——树(Tree)(下篇——应用提高 附C++代码):

https://blog.youkuaiyun.com/weixin_39951988/article/details/86538352

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

尘海折柳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值