数据结构:树,二叉树

1 树

1.0 基本概念

树是n( n ≥ 0 n\geq0 n0)个结点的有限集合T。当n=0时,称为空树,当n>0时,该集合满足如下条件:

  • 其中必有一个称为根(root)特定结点,没有直接前驱,但有零个或多个直接后继。
  • 其余n-1个结点可以划分为m个互不相交的有限集 T 1 , T 2 , . . . , T m T_1,T_2,..., T_m T1,T2,...,Tm,其中 T i T_i Ti又是一棵树,称为根root的子树,每棵子树的根结点有且仅有一个前驱,但有零个或多个直接后继。

1.2 示意图

在这里插入图片描述

图1.0 树结构示意图

1.3 引申概念

序号名词描述例证
1结点包含一个数据元素及若干指向其他结点的分支信息A,B,…,N都是结点
2节点的度一个结点的子树个数称为此结点的度A结点有3个子树,度为3
3叶节点度为0的结点,即无后继结点,也称为终端结点K,L,M,N无后继,为叶结点
4分支结点度不为0的结点,也称为非终端结点B为分支结点
5孩子结点一个结点的直接后继称为该结点的孩子结点D的孩子结点为H,I,J
6双亲结点一个结点的直接前驱称为该结点的双亲结点B,C,D的双亲结点为A
7兄弟结点同一双亲结点的孩子结点之间称为兄弟结点B,C,D为兄弟结点,E,F为兄弟结点
8祖先结点一个结点的祖先结点是从根结点到该结点的路径上的所有结点E的祖先结点为B,A
9子孙结点一个结点的直接后继和间接后继称为该结点的子孙结点B的子孙结点为E,F,K,L
10树的度树中所有结点的度的最大值上树的度为3,A和D度为3最大的分支数
11结点的层次从根结点开始定义,根结点的层次为1,根的直接后继的层次为2,依次类推A为1层,K为4层
12树的高度(深度)树中所有结点的层次的最大值树高为4
13有序树在树T中,如果各子树T_i之间是有先后次序的,则称为有序树
14森林m(m>=0)棵互不相交的树的集合,将一颗非空树的根结点删去,树就变成一个森林,反之,给森林增加一个统一的根结点,森林就变成一棵树

1.4 树的抽象数据类型

数据对象D:一个集合,该集合中所有元素具有相同的特性
数据关系R:若D为空集,则为空树,若D中仅含一个数据元素,则R为空集,否则R={H},H是如下的二元关系:

  • 在D中存在唯一的称为根的数据元素root,在关系H下没有前驱;
  • 除root外,D中每个节点在关系H下有且仅有一个前驱;

1.5 树的基本操作

序号名词描述
1InitTree(Tree)将Tree初始化为一颗空树
2DestoryTree(Tree)销毁树Tree
3CreateTree(Tree)创建树Tree
4TreeEmpyt(Tree)若Tree为空,返回True,否则False
5Root(Tree)返回树Tree的根
6Parent(Tree,x)树Tree存在,x是Tree中的某个结点,若x为非根结点,返回她的双亲,否则返回空
7FirstTree(Tree,x)树Tree存在,x是Tree中的某个结点,若x为非叶子结点,返回她的第一个孩子结点,否则返回空
8NextSibling(Tree,x)树Tree存在,x是Tree中某个结点,若x不是其双亲的最后一个孩子结点,返回x后面的下一个兄弟结点,否则返回空
9InsertChild(Tree,p,Child)树Tree存在,p指向Tree中某个结点,非空树Child与Tree不想交,将Child插入Tree中,做p所指向结点的子树
10DeleteChild(Tree,p,i)树Tree存在,p指向Tree中某个结点,1≤i≤d,d为p所指向结点的度,删除Tree中p指向结点的第i棵子树
11TraverseTree(Tree, Visit())树Tree存在,Visit()是对结点进行访问的函数,按照某种次序对树Tree的每个结点调用Visit()函数访问一次且最多一次,若Visit()失败,则操作失败

2 二叉树

2.1 概念

满足以下两个条件的树型结构称为二叉树(Binary Tree)。

  • 每个结点的度都不大于2
  • 每个结点的孩子结点次序不能任意颠倒

2.2 二叉树结构

二叉树有如下4种结构:
在这里插入图片描述

图2.1 二叉树结构

2.3 基本操作

序号名词描述
1Initiate(bt)将二叉树bt初始化为空二叉树
2Create(bt)创建一棵非空二叉树bt
3Destroy(bt)销毁二叉树bt
4Empty(bt)若二叉树bt为空,则返回True
5Root(bt)求二叉树bt的根结点,若bt为空,则返回空
6Parent(bt)求双亲函数,求二叉树bt中结点x的双亲结点,若结点x是二叉树的根结点或二叉树中无结点x返回空
7LeftChild(bt,x)求左孩子,若结点x为叶子结点或x不在bt中,返回空
8RightChild(bt,x)求右孩子,若结点x为叶子结点,或x不在bt中,返回空
9Traverse(bt)遍历操作,按某个次序一次访问二叉树中的每个节点一次且仅一次
10Clear(bt)清楚操作,将二叉树bt置为空树

2.4 二叉树性质

  • 二叉树的第i层上至多有 2 i − 1 2^{i-1} 2i1个结点, i ≥ 1 i\geq1 i1
  • 深度为k的二叉树,最多有 2 k − 1 2^{k}-1 2k1个结点;
  • 对任意一颗二叉树T,若终端结点数为 n 0 n_0 n0,度数为2的结点数为 n 2 n_2 n2,则 n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1
  • 具有n个结点的完全二叉树深度为 log ⁡ 2 n + 1 \log_2n+1 log2n+1;
  • 满二叉树:深度为k且共有 2 k − 1 2^k-1 2k1个结点的二叉树,每层结点都是满的,即每层结点都具有最大结点数;
    在这里插入图片描述
图2.2 满二叉树
  • 完全二叉树:除最后一层外,其余层均满;
    在这里插入图片描述
图2.3 完全二叉树

2.5 二叉树存储结构

二叉树的结构是非线性的,每一个结点最多可有两个后继,二叉树有两种存储结构:顺序存储结构和链式存储结构.

2.5.1 顺序存储结构

用一组连续的存储单元来存放二叉树的数据元素.
在这里插入图片描述

图2.4 二叉树顺序存储
  • 顺序存储
01234567891011121314
ABCDEFGHIJKLMNO
  • 单支树
    对于一般的二叉树,必须按照完全二叉树的形式来存储,这样会造成空间的浪费,单支树是一个极端情况.
    在这里插入图片描述
图2.5 单支树
01234567891011121314
ANULLCNULLNULLNULLGNULLNULLNULLNULLNULLNULLNULLO

2.5.2 链式存储结构

对于任意的二叉树来说,每个结点只有两个孩子,一个双亲结点,可以设计每个结点至少包括三个域:数据域,左孩子域和右孩子域.
在这里插入图片描述

图2.5 链式存储数据结构

在这里插入图片描述

图2.6 链式存储

2.5.3 三叉链表

在这里插入图片描述

图2.7 三叉链表树结构

2.6 二叉树的遍历与线索化

2.6.1 二叉树的遍历规定

按一定规律对二叉树中的每个结点进行访问且仅访问一次.二叉树结构如图2.5所示,现定义如下:

序号指令描述
1L遍历左子树
2D访问根结点
3R遍历右子树
  • 遍历规定
序号指令描述
1DLR访问根,遍历左子树,遍历右子树
2DRL访问根,遍历右子树,遍历左子树
3LDR遍历左子树,访问根,遍历右子树
4LRD遍历左子树,遍历右子树,访问根
5RDL遍历右子树,访问根,遍历左子树
6RLD遍历右子树,遍历左子树,访问根

根据对根的访问顺序,分别规定先序遍历(先根遍历),中序遍历(对称遍历)和后序遍历;

序号命令描述流程
1DLR先序遍历首先访问根结点,其次先序遍历左子树,最后先序遍历右子树,当遍历结点为空时,执行下一遍历动作,否则一直遍历本动作
2LDR中序遍历首先中序遍历左子树,其次访问根结点,最后中序遍历右子树,当遍历结点为空时,执行下一遍历动作,否则一直遍历本动作
3LRD后序遍历首先后序遍历左子树,其次后序遍历右子树,最后访问根结点,当遍历结点为空时,执行下一遍历动作,否则一直遍历本动作

2.6.2 遍历

在这里插入图片描述

图2.7 二叉树结构
  • 说明
参数说明
L_aA结点的左子树,且有分支,L表示左子树地址,a表示结点
R_aA结点的右子树,且有分支,R表示右子树地址,b表示结点
R_bnB结点的左子树,无分支,n表示null空
  • 遍历结果
    先序遍历DLR:
    A ↦ B ↦ D ↦ F ↦ G ↦ C ↦ E ↦ H A\mapsto B\mapsto D \mapsto F \mapsto G\mapsto C \mapsto E\mapsto H ABDFGCEH
    中序遍历LDR:
    B ↦ F ↦ D ↦ G ↦ A ↦ C ↦ E ↦ H B\mapsto F\mapsto D \mapsto G \mapsto A\mapsto C \mapsto E\mapsto H BFDGACEH
    后序遍历LRD:
    F ↦ G ↦ D ↦ B ↦ H ↦ E ↦ C ↦ A F\mapsto G\mapsto D \mapsto B \mapsto H\mapsto E \mapsto C\mapsto A FGDBHECA
  • 遍历过程
    先序遍历
    在这里插入图片描述
图2.8 先序遍历过程
更新ing

【参考文献】
[1]https://wenku.baidu.com/view/57d26d1ab80d6c85ec3a87c24028915f804d84be.html?from=search
[2]https://wenku.baidu.com/view/c74bb0184693daef5ff73dc9.html?from=search

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 二叉树是一种数据结构,它由一个根节点和最多两个子组成,这两个子称为左子和右子二叉树中的每个节点最多有两个子节点,如果一个节点只有一个子节点,那么这个子节点必须是左子节点。 二叉树有很多种类型,最基本的二叉树是二叉搜索。在二叉搜索中,左子的所有节点的值都小于根节点的值,右子的所有节点的值都大于根节点的值。这使得在二叉搜索中进行查找、插入和删除操作非常高效。 除了二叉搜索,还有平衡二叉树、红黑、B等多种二叉树类型,每种类型的二叉树都有其特定的应用场景和优缺点。 二叉树的遍历方式有三种:前序遍历(先访问根节点,然后遍历左子和右子)、中序遍历(先遍历左子,然后访问根节点,最后遍历右子)和后序遍历(先遍历左子和右子,最后访问根节点)。二叉树的遍历方式是解决很多问题的基础,比如查找二叉树中的最大值、计算二叉树的深度等。 ### 回答2: 二叉树是一种重要的数据结构,它由一组称为节点的元素组成,每个节点最多可以连接到两个子节点,分别称为左子节点和右子节点。二叉树的一个节点可以表示一个值或者一条数据二叉树具有以下特点: 1. 根节点:二叉树的顶部节点称为根节点,它是整个的起点。 2. 叶子节点:没有子节点的节点称为叶子节点,它们位于的末端。 3. 分支节点:有子节点的节点称为分支节点,它们是的中间节点。 4. 子:以某个节点为根节点,将其及其后代节点组成的称为。 5. 左子和右子:一个节点的左右子节点分别构成左子和右子。 6. 高度:中节点的最大层次称为的高度。 二叉树有多种变种,如满二叉树、完全二叉树等。满二叉树是一种每个节点都有两个子节点的二叉树,而完全二叉树是一种除了最后一层外,其他层都是满的二叉树二叉树的应用十分广泛,常见的应用场景包括文件系统、数据库索引等。在二叉树中,插入、删除、查找等操作效率很高,时间复杂度通常为O(logN)。然而,如果二叉树退化成链表,操作效率会大大降低,时间复杂度为O(N)。 总的来说,二叉树是一种简单但十分重要的数据结构。它能够高效地存储、操作数据,被广泛应用于各个领域。 ### 回答3: 二叉树是一种常见的数据结构,它由节点组成,每个节点最多有两个子节点。 二叉树的特点是左子节点小于父节点,而右子节点大于父节点,这样的特性方便在中进行排序和搜索操作。 二叉树有多种常见的类型,包括满二叉树、完全二叉树和平衡二叉树等。 满二叉树是指除了叶子节点外,每个节点都有两个子节点的二叉树。 完全二叉树是指除了最后一层以外的其他层都是满的,最后一层的节点从左到右依次填满。 平衡二叉树是指左子和右子的高度差不超过1的二叉树,这样可以保证在最坏情况下的搜索时间复杂度为O(logn)。 二叉树可以使用数组或链表实现,具体选择取决于应用场景和需求。 在二叉树中,我们可以使用递归或迭代的方式进行遍历操作,包括先序遍历、中序遍历和后序遍历。 先序遍历是指先访问根节点,然后递归遍历左子和右子。 中序遍历是指先递归遍历左子,然后访问根节点,最后递归遍历右子。 后序遍历是指先递归遍历左子和右子,然后访问根节点。 二叉树还可以进行插入、删除和查找操作。插入操作一般按照二叉搜索的规则进行,即比根节点小的值插入左子,比根节点大的值插入右子。删除操作需要考虑不同情况,包括删除叶子节点、删除有一个子节点的节点和删除有两个子节点的节点。查找操作可以根据二叉搜索的性质进行递归或迭代实现。 总之,二叉树是一种常见且重要的数据结构,能够方便地进行排序、搜索和插入等操作,同时还有多种类型和遍历方式供选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天然玩家

坚持才能做到极致

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

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

打赏作者

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

抵扣说明:

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

余额充值