经过数据结构(二)系列文章,已经把线性结构中最常用的数据结构进行了介绍,包括顺序存储结构中顺序表、顺序队列和顺序栈,链式存储结构中的链表、链栈和链队列。线性结构是数据结构中最为常见也最简单的逻辑结构。下面将进入非线性逻辑的数据结构部分,还记得下面的一副数据结构的分类图吧,对于非线性逻辑,主要介绍树和图。本文主要先针对树进行复习和总结,后续的博文将逐渐深入到图等更为复杂的非线性逻辑数据结构。

树的总论

树的直观示意图

树的定义

树是 n(n≥0)个结点的有限集T,其中有且仅有一个特定的结点,称为树的根(root)。当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,……Tm,其中每一个集合本身又是一棵树,称为根的子树(subtree)。

树的特点

树中至少有一个结点——根(root);

树中各子树是互不相交的集合。

基本概念和术语

结点(node)——表示树中的元素
结点的度(degree)——结点拥有的子树数
叶子(leaf)——度为0的结点
孩子(child)——结点子树的根称为该结点的孩子
双亲(parents)——孩子结点的上层结点叫该结点的~
兄弟(sibling)——同一双亲的孩子
树的度——一棵树中最大的结点度数
结点的层次(level) ——从根结点算起,根为第一层,它的孩子为第二层……
深度(depth)——树中结点的最大层次数
森林(forest) ——m(m>0)棵互不相交的树的集合

路径:根节点到某节点之间;两节点之间;路径是唯一的
路径的长度
结点的深度 (depth),高度(height)
树的深度,高度
结点的祖先
结点后代

树的种类

有向树:(1) 有确定的根;(2) 树根和子树根之间为有向关系

有序树:子树之间存在确定的次序关系

无序树:子树之间不存在确定的次序关系

下面通过一个例子来充分理解上面提到的那些概念和术语:

树的表示

如下图所示

深林

是m(m≥0)棵互不相交的树的集合。如图所示,任何一棵非空树是一个二元组,Tree = (root,F),其中:root 被称为根结点,F 被称为子树森林

树与线性结构的比较

线性结构:第一个数据元素(无前驱);最后一个数据元素(无后继);其它数据元素(一个前驱、一个后继)

树型结构:根结点(无前驱);多个叶子结点(无后继);其它数据元素(一个前驱、多个后继)。

二叉树

或为空树;或是由一个根结点加上两棵分别称为左子树和右子树的、互不交的二叉树组成。二叉树的五种基本形态如图所示

二叉树的性质

性质 1 :在二叉树的第 i层上至多有2i-1 个结点。 (i≥1)可用归纳法证明
性质 2 :深度为 k 的二叉树上至多含2k-1 个结点(k≥1)
性质 3 :对任何一棵二叉树,若它含有n0叶子结点n2 个度为 2的结点,则必存在关系式:n0=n2+1
证明:
设二叉树上结点总数 n = n0+n1+n2
二叉树上分支总数 b = n1+2n2
b = n-1 = n0+n1+n2-1

两类特殊的二叉树

满二叉树:指的是深度为k且含有2k-1个结点的二叉树。
完全二叉树:树中所含的 n 个结点和满二叉树中编号为 1 至 n 的结点一一对应

性质 4 :具有 n 个结点的完全二叉树的深度为d,则满足关系式:n = 2d-1

性质 5 :若对含 n 个结点的完全二叉树从上到下且从左至右进行 1至 n的编号,则对完全二叉树中任意一个编号为 i的结点:
(1) 若 i=1,则该结点是二叉树的根,无双亲, 否则编号i/2的结点为双亲结点
(2)若 2i>n,则该结点无左孩子否则,编号为 2i 的结点为其左孩子结点;
(3) 若 2i+1>n,则该结点无右孩子结点,否则,编号为2i+1 的结点为其右孩子结点。

二叉树的存储结构

二叉树的顺序存储表示

实现:按满二叉树的结点层次编号,依次存放二叉树中的数据元素
特点:结点间关系蕴含在其存储位置中浪费空间,适于存满二叉树和完全二叉树

建立二叉树的顺序存储结构

voidMakeSeqBTree(SeqList *L)

{

char ch;

ch=getchar();

while(ch!=‘\n’)

{  if(ch!=‘ ‘)

InsertRear(L,ch);

ch=getchar();

}

}

数组下标i和二叉树层次间的关系
i>0,data[(i-1)/2]不是虚结点就是i的双亲,i=0是根
如果2i+1<L->size,data[2i+1]不是虚结点就是左孩子;2i+1>L->size,data[i]是叶子
如果2i+2<L->size,data[2i+2]不是虚结点就是右孩子;2i+2>L->size,data[i]无右孩子
i是偶数且>0,data[i-1]不是虚结点就是data[i]的左兄弟
如果i<L->size且是奇数,data[i+1]不是虚结点就是data[i]的右兄弟

顺序存储结构:

孩子表示法

应用范围:适用于二叉树上的结点个数已知,或不支持动态存储分配的高级语言

双亲表示法

实现:定义结构数组存放树的结点,每个结点含两个域:
            数据域:存放结点本身信息
            双亲域:指示本结点的双亲结点在数组中位置
特点:找双亲容易,找孩子难

二叉树的链式存储表示

二叉链表
三叉链表

二叉树的建立

二叉树的建立是指在内存中建立二叉树存储结构。
二叉树的顺序存储结构的建立比较简单,只需将二叉树各个结点的信息(值)按原有的逻辑关系送入相应的向量单元中即可。
二叉树链式存储结构的建立算法有多种。
   按完全二叉树的层次顺序,依次输入结点信息建立二叉链表的算法。对于一般的二叉树,必须添加若干个虚结点使其成为完全二叉树。

由顺序表建立二叉树算法的基本思想

1。初始,顺序表中的第一个元素建立根结点,并将根指针入队
2。对顺序表的元素顺序扫描,如果不是虚结点,其结点指针恰是队头元素,则删除队头;如果该元素在表中有左右孩子,则建立左右孩子并与出队结点连接,孩子结点入队。

*******************************************************************************************************************************************************************************************************

2015-7-29

转载于:https://www.cnblogs.com/huty/p/8519290.html

数据结构(三):非线性逻辑结构-树相关推荐

  1. 数据结构三要素——逻辑结构和物理结构与数据运算之间的关系

    数据结构的三要素是:逻辑结构,物理结构,数据的运算. 逻辑结构: 分为线性结构个非线性结构. 线性结构就是有一一对应的关系的,如A-B-C,这三个字母就符合线性结构. 非线性结构就是集合,树,图.集合 ...

  2. 数据结构考研:数据结构的三要素:逻辑结构,存储结构,数据计算的详细区分与讲解(软件工程/计算机/王道论坛)

    一.问题背景 不管是计算机专业的考研初试还是工作面试,数据结构都是很重要的课程.而博主最近看的王道论坛2020的数据结构开篇就有数据结构的三要素:逻辑结构,存储结构,数据计算,而在数据结构的考研真题和 ...

  3. 数据结构(三):非线性逻辑结构-特殊的二叉树结构:堆、哈夫曼树、二叉搜索树、平衡二叉搜索树、红黑树、线索二叉树

    在上一篇数据结构的博文<数据结构(三):非线性逻辑结构-二叉树>中已经对二叉树的概念.遍历等基本的概念和操作进行了介绍.本篇博文主要介绍几个特殊的二叉树,堆.哈夫曼树.二叉搜索树.平衡二叉 ...

  4. 【数据结构】数据结构三要素

    数据结构三要素 数据结构的三要素包括数据逻辑结构.数据存储结构和数据的运算. 数据逻辑结构 数据的逻辑结构是指数据元素之间的逻辑关系,即从逻辑关系上描述数据.它与数据的具体存储形式无关,是独立于计算机 ...

  5. 【Python数据结构系列】☀️《树与二叉树-基础知识》——知识点讲解+代码实现☀️

    文章目录 数据结构之树和二叉树 第一部分 树和二叉树的基础知识 1.树和二叉树的定义 1.1 树的定义 1.2 树的基本术语 1.3 二叉树的定义 2.二叉树的性质和存储结构 2.1 二叉树的性质 2 ...

  6. 数据结构概述(逻辑结构与存储结构概念详解)

    目录 一.一些基本概念 二.逻辑结构 1.集合结构: 2.线性结构: 1)线性表: 2)栈 3)队列 4)串 3.非线性结构: 1)数组 2)广义表 3)树 4)堆 5)图 三.物理结构/存储结构 1 ...

  7. 三、逻辑结构与存储结构的区分

    一.问题背景 不管是计算机专业的考研初试还是工作面试,数据结构都是很重要的课程.而博主最近看的王道论坛2020的数据结构开篇就有按照逻辑结构和存储结构将各种数据结构进行分类,本文就结合所有知识点充分讲 ...

  8. 数据结构与索引-- B+树索引

    B+树索引 上一节中我们讨论的都是B+树的数据结构的由来以及他的一些操作,B+树索引在本质就是B+树在数据库中的一个实现,但是B+索引在数据库中有一个特点就是他的高扇出性,因此在数据库中,B+树的高度 ...

  9. 数据结构与算法--B树原理及实现

    B树 前几篇文中讨论的数据结构我们都是假设所有的数据都存储在计算机的主存中.可说总要那么海量的数据需要通过个中数据结构去存储,我们不可能有这么多内存区存放这些数据.那么意味着我们需要将他们放磁盘.所以 ...

最新文章

  1. Java培训进阶书籍推荐,赶快收藏起来!
  2. spring getbean 方法分析
  3. 电脑音响怎么插_厦门靓车港丰田凯美瑞汽车音响改装德国HELIX汽车音响|凯美瑞|音响改装|汽车|内饰...
  4. complementary prior
  5. 分数化简_分数应用题七讲 (一) 图示法解分数应用题
  6. Docker 上安装、启动 MySQL (图解)
  7. linux 脚本在哪里编写,Linux 脚本编写基础(一)
  8. 质量不同的球java编程_荐非常经典的java编程题全集-共50题(1-10)...
  9. python测试驱动开发 中文版_GitHub - starryrbs/python_tdd: 使用Python测试驱动开发完成Django项目...
  10. 当前上下文中不存在名称 ViewBag
  11. 8.3-8.4上海外滩迪士尼两日游
  12. 虚拟机无法通过dhcp获取到IP地址
  13. mac机c4d更改语言,Win/Mac版:C4D R18 三维软件 Cinema 4D C4D R18 正式完整版 + 中文/英文注册机版...
  14. AE效果:模糊和锐化
  15. HTML5响应式企业集团织梦模板,(自适应手机版)响应式企业集团通用类网站织梦模板 HTML5响应式大气通用企业织梦源码+PC+wap+利于SEO优化...
  16. 前端背景粒子线条效果
  17. 如何用 js 获取虚拟键盘高度?(适用所有平台)
  18. Excel - 单元格的引用 (如:A1、$A$1)
  19. d3js 学习 :d3-selection(一)概况
  20. 【PyQt】自制的MC披风生成器

热门文章

  1. c++ 实现outlook itemsend_2021智能C端冬季科创训练营作业已发布,请注意查收~
  2. CVPR 2022 论文和开源项目合集
  3. 马来西亚什么时候学计算机,关于马来西亚大学里的计算机专业,你知道多少?...
  4. android 屏幕方向改变 重新测量,android – 扫描时自动更改屏幕方向(使用ZXING库)...
  5. linux内核设计与实现 epub_mongodb内核源码设计实现、性能优化、最佳运维系列-网络传输层模块源码实现四...
  6. android 文件系统,创建单个文件大小有2G限制
  7. JavaWeb国际化
  8. 独家揭秘:微博深度学习平台如何支撑4亿用户愉快吃瓜?
  9. KNN算法之图像处理二
  10. 2017年苹果企业开发者账号申请完整指南