`
jefferent
  • 浏览: 80526 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

树——二叉树基础

阅读更多

1. 前言 

    二叉树是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。

 

2. 二叉树的定义

    二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的、分别称作这个根的左子树和右子树的二叉树组成。

    二叉树可以是空集;根可以有空的左子树或右子树;或者左、右子树皆为空。
    二叉树的五种基本形态如下图所示。

图 二叉树的五种基本形态

3. 二叉树的基本操作

(1)InitBiTree(&T);

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

(2)DestroyBiTree(&T);

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

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

(3)CreateBiTree(&T,definition);

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

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

(4)ClearBiTree(&T);

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

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

(5)BiTreeEmpty(T);

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

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

(6)BiTreeDepth(T);

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

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

(7)Root(T);

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

    操作结果:返回二叉树T的根。

(8)Value(T,e);

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

    操作结果:返回e的值。

(9)Assign(T,&e,value);

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

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

(10)Parent(T,e);

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

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

(11)LeftChild(T,e);

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

    操作结果:返回e的左子女。若e无左子女,则返回"空"。

(12)RightChild(T,e);

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

    操作结果:返回e的右子女。若e无右子女,则返回"空"。

(13)InsertChild(T,p,LR,c);

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

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

(14)DeleteChild(T,p,LR);

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

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

(15)PreOrderTraverse(T,Visit());

    初始条件:二叉树T存在,Visit是对结点操作的应用函数。

    操作结果:先序遍历T,对每个结点调用函数Visit一次且仅一次。一旦Visit()失败,则操作失败。

(16)InOrderTraverse(T,Visit());

    初始条件:二叉树T存在,Visit是对结点操作的应用函数。

    操作结果:中序遍历T,对每个结点调用函数Visit一次且仅一次。一旦Visit()失败,则操作失败。

(17)PostOrderTraverse(T,Visit());

    初始条件:二叉树T存在,Visit是对结点操作的应用函数。

    操作结果:后序遍历T,对每个结点调用函数Visit一次且仅一次。一旦Visit()失败,则操作失败。

 

4. 几种特殊的二叉树

(1)满二叉树(FullBinaryTree)

    一棵高度为k,并且含有2k-1个结点的二叉树为满二叉树。因此,在满二叉树中,每一层结点都达到了最大个数。除最低层结点的度为0外,其他各层结点的度都为2。

    满二叉树的特点:

  • 每一层上的结点数都达到最大值。即对给定的高度,它是具有最多结点数的二叉树。
  • 满二叉树中不存在度数为1的结点,每个分支结点均有两棵高度相同的子树,且树叶都在最下一层上。   

(2)完全二叉树(Complete BinaryTree)

    若一棵二叉树至多只有最下面的两层上结点的度数可以小于2,并且最下一层上的结点都集中在该层最左边的若干位置上,则此二叉树称为完全二叉树。

完全二叉树的特点:

  • 满二叉树是完全二叉树,完全二叉树不一定是满二叉树。
  • 在满二叉树的最下一层上,从最右边开始连续删去若干结点后得到的二叉树仍然是一棵完全二叉树。
  • 在完全二叉树中,若某个结点没有左孩子,则它一定没有右孩子,即该结点必是叶结点。

图 特殊形态的二叉树

5. 二叉树的性质

性质1:二叉树第i层上的结点数目最多为2i-1(i≥1)。

性质2:深度为k的二叉树至多有2k-1个结点(k≥1)。

性质3:在任意-棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则no=n2+1。

性质4:具有n个结点的完全二叉树的深度为:

6. 二叉树的存储表示与实现

二叉树的存储结构有两种:顺序存储表示和链式存储表示。

(1)顺序存储表示

    按照顺序存储结构的定义,用一组地址连续的存储单元以此自上而下、自左至右存储完全二叉树上的结点元素,即将完全二叉树上编号为i的结点元素存储在如上定义的一维数组中下标为i-1的分量中。对于一般二叉树,则应将其每个结点与完全二叉树上的结点相对照,存储在一维数组的相应分量中,空缺表示不存在此结点。由此可见,这种顺序存储结构比较适用于完全二叉树,而不太适用于非完全二叉树。因为,在最坏的情况下,一个深度为k且只有k个节点的单支树(树中不存在度为2的结点)却需要长度为2k-1的一维数组。如下图所示:

图 完全二叉树的顺序存储表示

图 一般二叉树的顺序存储

    二叉树的顺序存储表示:

#define MAX_TREE_SIZE 100
//二叉树的最大结点数  
typedef ElemType SqBiTree[MAX_TREE_SIZE]
//0号单元存储根结点
SqBiTree bt; 

    二叉树顺序存储的优缺点:

① 对完全二叉树而言,顺序存储结构既简单又节省存储空间。
② 一般的二叉树采用顺序存储结构时,虽然简单,但易造成存储空间的浪费。【例】最坏的情况下,一个深度为k且只有k个结点的右单支树需要2k-1个结点的存储空间。
③ 在对顺序存储的二叉树做插入和删除结点操作时,要大量移动结点。

(2)链式存储表示

二叉树的每个结点最多有两个孩子。用链接方式存储二叉树时,每个结点除了存储结点本身的数据外,还应设置两个指针域lchild和rchild,分别指向该结点的左孩子和右孩子。结点的结构为:

图 二叉树链式存储结构

    其中,data表示值域,用于存储对应的数据元素,lchild和rchild分别表示左指针域和右指针域,分别用于存储左子女结点和右子女结点(即左、右子树的根结点)的存储位置(即指针)。

    对应C语言结点类型定义如下:

typedef char DataType; //用户可根据具体应用定义DataType的实际类型 
    typedef struct node{
          DataType data; 
          Struct node *lchild,*rchild; //左右孩子指针
      }BinTNode; //结点类型
    typedef BinTNode *BinTree;//BinTree为指向BinTNode类型结点的指针类型

 

    在一棵二叉树中,所有类型为BinTNode的结点,再加上一个指向开始结点(即根结点)的BinTree型头指针(即根指针)root,就构成了二叉树的链式存储结构,并将其称为二叉链表。

    下面左图所示二叉树的二叉链表如下面中图所示:

图 二叉树链式存储结构示意图

注意:
    ① 一个二叉链表由根指针root惟一确定。若二叉树为空,则root=NULL;若结点的某个孩子不存在,则相应的指针为空。
    ② 具有n个结点的二叉链表中,共有2n个指针域。其中只有n-1个用来指示结点的左、右孩子,其余的n+1个指针域为空。

    经常要在二叉树中寻找某结点的双亲时,可在每个结点上再加一个指向其双亲的指针parent,形成一个带双亲指针的二叉链表。【例】上面右图是上面左图所示的二叉树的带双亲指针的二叉链表。

分享到:
评论

相关推荐

    数据结构——二叉树有关操作程序

    三) 在(二)的基础上,求二叉树的深度+结点数 (1)求出二叉树的深度并显示; (2)求出二叉树的结点总数并显示; (3)求叶子结点总数并显示。 四)应用题 (1)编制一个递归算法,求一个二叉树中位于先序序列中第k个...

    北京邮电大学_信通院_数据结构_二叉树 C++

    2.1 题目 1——基础实验 根据二叉树的抽象数据类型的定义,使用二叉链表实现一个二叉树。 二叉树的基本功能: 1、二叉树的建立 2、前序遍历二叉树 3、中序遍历二叉树 4、后序遍历二叉树 5、按层序遍历二叉树 6、求...

    java实现二叉树遍历算法(源代码)

    本文介绍了使用Java语言实现二叉树前序、中序和后序遍历的基本算法。首先,定义了一个简单的TreeNode类来表示二叉树的节点,包括节点...这些遍历算法是二叉树操作的基础,对于理解树形数据结构和算法设计具有重要意义。

    数据结构——树 课件

    所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。

    数据结构讲义(严蔚敏版)(含算法源码).rar

    6. 树和二叉树 2 7. 图 2 8. 查找表 3 9. 内部排序 3 第1章 绪论 5 一、 基础知识 5 二、 算法 5 三、 习题 6 第2章 线性表 7 一、 基础知识和算法 7 1. 线性表及其特点 7 2. 顺序表——线性表的顺序存储结构 7 3. ...

    Java数据结构和算法

    (1)数据结构与算法概念解析 (2)数据结构之数组 (3)数据结构之栈 (4)数据结构之队列 (5)数据结构之链表 (6)数据结构之二叉树 (7)数据结构之霍夫曼树 (8)数据结构之红黑树(一)——基础分析 ...

    数据结构算法

    第二天 平衡二叉树 6天通吃树结构—— 第一天 二叉查找树 算法速成系列(15)算法系列15天速成——第十五天 图【下】(大结局) 算法系列15天速成——第十四天 图【上】 算法系列15天速成——第十三天 树操作【下】 ...

    零基础征服数据结构算法Python版2023

    分享一套python版的数据结构算法的视频教程——《零基础征服数据结构算法Python版》,2023年4月完结新课,提供配套的代码和课件下载! 《零基础征服数据结构算法...第5章 树与二叉树 第6章 图 第7章 查找 第8章 排序

    【1.数据结构和算法学习目录】

    本专栏记录研究生期间算法学习过程,从基础回顾到算法...【算法——二叉树】 【算法——字符串】 【算法——数组】 【2.排序算法】 【2.排序算法——编程题】 【3.搜索算法】 【3.搜索算法——编程题】 【4.贪心算法】

    计算机科学与工程领域——数据结构与算法的专著 C/C++数据结构算法

    数据结构:二叉树和一般树、优先队列:堆、左高树、竞赛树、搜索树、图 算法设计方法:贪心算法、分治算法、动态规划、回溯、分支限界等多种算法设计方法,为数据结构与算法的继续学习和研究奠定了一个坚实的基础。 ...

    数据结构与算法:语言描述(中英文)

    第12章为读者介绍另一种经典数据结构——二叉树。二叉查找树作为二叉树的特殊类型将是本章的主要内容。其他二叉树类型在第15章进行介绍。 第13章向读者说明在集合中存储数据的方法。这种方法在数据结构只存储唯一...

    数据结构辅导讲义

    6. 树和二叉树 2 7. 图 2 8. 查找表 3 9. 内部排序 3 第1章 绪论 5 一、 基础知识 5 二、 算法 5 三、 习题 6 第2章 线性表 7 一、 基础知识和算法 7 1. 线性表及其特点 7 2. 顺序表——线性表的顺序存储结构 7 3. ...

    算法:算法C语言实现 第1-4部分 基础知识、数据结构、排序及搜索

    第四部分“搜索”(第12~16章)在进一步讲解符号表、树等抽象数据类型的基础上,重点讨论散列方法、基数搜索以及外部搜索方法。 书中提供了用C语言描述的完整算法源程序,并且配有丰富的插图和练习。作者用简洁的...

    C#,笛卡尔树(Cartesian Tree)的构造、遍历算法与源代码

    笛卡尔树是一种特定的二叉树数据结构,可由数列构造, 在范围最值查询、范围top k查询(range top k queries)等问题上有广泛应用。勒内·笛卡尔(René Descartes,1596年3月31日-1650年2月11日),1596年3月31日生于...

    挑战程序设计竞赛(第2版)

    2.4.1 树和二叉树 2.4.2 优先队列和堆 2.4.3 二叉搜索树 2.4.4 并查集 2.5 它们其实都是“图” 2.5.1 图是什么 2.5.2 图的表示 2.5.3 图的搜索 2.5.4 最短路问题 2.5.5 最小生成树 2.5.6 应用问题 2.6 数学问题的...

    斯坦福cs223-数据结构课件

    数据结构是计算机科学中的一个重要概念,它指的是计算机中存储、...常见的树结构包括二叉树、平衡树(如AVL树)、红黑树等。 6. **图(Graph)**:用于表示物件之间的多对多关系。图由节点(或顶点)和边组成,边可以是

    计算机二级公共基础知识

    在二叉树中,每一个结点的度最大为2,即所有子树(左子树或右子树)也均为二叉树。另外,二叉树中的每个结点的子树被明显地分为左子树和右子树。 在二叉树中,一个结点可以只有左子树而没有右子树,也可以只有右子树...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    他是我国计算机普及和高校计算机基础教育开拓者之一,现任全国高等院校计算机基础教育研究会会长、教育部全国计算机应用技术证书考试委员会主任委员。 谭浩强教授创造了3个世界纪录:(1)20年来他(及和他人合作)...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    他是我国计算机普及和高校计算机基础教育开拓者之一,现任全国高等院校计算机基础教育研究会会长、教育部全国计算机应用技术证书考试委员会主任委员。 谭浩强教授创造了3个世界纪录:(1)20年来他(及和他人合作)...

Global site tag (gtag.js) - Google Analytics