初阶数据结构 初识二叉树

  • 一. 树
    • 1. 基本概念
    • 2. 常用术语
    • 3. 代码表示
    • 4. 实际运用
  • 二. 二叉树
    • 1. 基本概念
    • 2. 特殊的二叉树
    • 3. .二叉树的顺序结构及实现
      • (1)顺序结构
      • (2)链式存储
    • 4. 二叉树的性质
  • 三 两道简单题
    • 题目一
    • 题目二

一. 树

1. 基本概念

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

这里又几个容易错的概念给大家解释下

1 当n等于0时 它也是一个数 这时候将它称之为空数

2 除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继

3 子数是不相交的

4 除了根节点外 所有节点有且只有一个父节点

5 一个N个节点的树一定有N-1个边

2. 常用术语

  1. 节点的度:一个节点含有的子树的个数称为该节点的度

这个很容易理解

比如说上图的A就有6个度

上图的D就有两个度

J有0个度

  1. 非终端节点或分支节点

度不等于0的节点就是非终端或分支节点

比如说 A D

  1. 双亲节点或父节点

如果说一个节点拥有子节点 那么就称这个节点是它们子节点的父节点

比如说F是K的父节点

G是N的父节点

  1. 孩子节点或子节点

这个和上面的概念相反

只需要反过来就可以了

比如说

K是F的子节点

N是G的子节点

  1. 树的度

一个树中最大节点的度称为这个树的度

  1. 节点的层次

从树的根开始定义 第一层是根 第二层是根的子节点 以此类推

  1. 树的高度或深度

树的最大层次称为这个数的高度

  1. 堂兄弟节点(不常用)

在同一层次的节点叫做堂兄弟节点

  1. 节点的祖先

从根到该节点所经分支上的所有节点

例如说 在上图中A是所有节点的祖先

  1. 子孙

以某节点为根的子树中任一节点都称为该节点的子孙

例如上图中所有节点都是A的子孙

  1. 由m(m>0)棵互不相交的树的集合称为森林

这个概念了解就好 我们目前阶段其实用的不多

3. 代码表示

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,实际中树有很多种表示方式,如:双亲表示法,孩子表示法、孩子兄弟表示法等等。我们这里就简单的了解其中最常用的孩子兄弟表示法。

代码表示如下

typedef int DateType; // 定义我们下面的数据类型 struct Node
{struct Node* firstchild; // 第一个孩子节点struct Node* pnextbrothr; // 第一个兄弟节点DateType date;// 存储的数据
};

我们将每个节点储存它们的第一个孩子节点和第一个兄弟节点

那么我们要查找的时候就会是这样子


看上去很清晰是吧

4. 实际运用


我们储存文件 就是使用的树这一种数据结构来存储的

想想看是不是

我们点开C盘 然后出现很多的文件

再点开一个 又会出现很多的文件

二. 二叉树

1. 基本概念

一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。

二叉树的特点:

  1. 每个结点最多有两棵子树,即二叉树不存在度大于2的结点。
  2. 二叉树的子树有左右之分,其子树的次序不能颠倒。

2. 特殊的二叉树

  1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。

  2. 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。

这里我们有两个比较特殊的二叉树

一个叫做满二叉树

一个叫做完全二叉树

什么是满二叉树呢?

就是除了根节点和叶节点之外 每一个节点的度数都是2

什么是完全二叉树呢?

当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树

我们这里要注意的是 满二叉树是一种特殊的完全二叉树

3. .二叉树的顺序结构及实现

(1)顺序结构

普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。
现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。


顺序结构就是将二叉树按照从左到右 从上到下的顺序存储到数组当中

如果说不是一个完全二叉树的话就势必要空出来很多的位置 从而导致空间的浪费

(2)链式存储

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。
链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链,后面课程学到高阶数据结构如红黑树等会用到三叉链。

这里简单提一下 大家有个印象就好

我们这几篇博客主要介绍顺序存储

代码表示如下

typedef int DateType; // 定义我们下面的数据类型 struct Node
{struct Node* firstchild; // 第一个孩子节点struct Node* pnextbrothr; // 第一个兄弟节点DateType date;// 存储的数据
};

4. 二叉树的性质

  1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1) 个结点.

  2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2^h- 1.

  3. 对任何一棵二叉树, 如果度为0其叶结点个数为 n0, 度为2的分支结点个数为 n2,则有n0=n2+1

  4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=Log2(n+1). (ps:Log2(n+1)是log以2为
    底,n+1为对数)

  5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对
    于序号为i的结点有:

    1.若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点
    2.若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子
    3.若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子

三 两道简单题

题目一

  1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( )

A 不存在这样的二叉树
B 200
C 198
D 199

这个刚好符合我们的性质3

对任何一棵二叉树, 如果度为0其叶结点个数为 n0, 度为2的分支结点个数为 n2,则有n0=n2+1

所以说叶节点或者说度为0的节点的个数是200

题目二

.在具有 2n 个结点的完全二叉树中,叶子结点个数为( )

A n
B n+1
C n-1
D n/2

这个时候我们假设将叶子的节点分为三种

一是度为0的节点 X0

一是度为2的节点 X2 (X0-1)

一是度为1的节点 X1(0或1)

这里要注意的是 再一个完全二叉树中度为1的节点只有可能是0或1

所以说总的节点数等于

2X0-1+1 = 2n

或者

2X0 = 2n+1

所以说X0的个数为 N或者 (2N+1)/2

所以说叶节点的个数为n

初阶数据结构 初识二叉树相关推荐

  1. C语言初阶_初识C语言(1)

    凡是过往,皆为序章 期末考试结束了,真是感慨良多啊...... C语言编程题大家都做对了多少呢? 不管怎么样,都已经过去了.不管你学得怎么样,都可以在接下来的时间里,我们一起重新回顾一遍C语言初阶的知 ...

  2. 数据结构初阶——链式二叉树

    目录 树概念及结构 树的概念 树的表示 二叉树概念及结构 概念 特殊二叉树 二叉树的性质 二叉树链式结构及实现 二叉树的简单创建 二叉树的前序遍历 二叉树中序遍历与二叉树后序遍历 求二叉树节点个数 求 ...

  3. 初阶数据结构前部分总结

    1.什么是数据结构 指将数据按特定的规则,存储到特定的结构中 2.算法效率 指解决问题的效率.解决某问题的算法的好坏取决于所需内存空间 和花费的时间 而其时间和空间用复杂度来衡量(采用大O的渐进表示法 ...

  4. 初阶数据结构之带头+双向+循环链表增删查实现(三)

    文章目录 @[TOC](文章目录) 前言 一.带头双向循环链表的初始化 1.1带头双向循环链表的结构体定义 1.2初始化代码的实现 二.带头+双向+循环链表的增功能实现 2.1头插代码的实现 2.2尾 ...

  5. 【C语言初阶】初识C语言(上)

    初识C语言

  6. C语言初阶数据结构(四)栈(详细图解,简单上手,通俗易懂)

    目录 今日良言:少年没有乌托邦,心向阳光自明朗 一.各功能实现以及图解+成果展示 1.1栈的结构图解 1.2初始化栈 1.3入栈操作 1.4出栈操作 1.5输出栈内元素 1.6求栈顶元素 1.7输出栈 ...

  7. 【C初阶】——初识C语言(万字篇,带你敲响C语言的大门)

    接受平凡,努力出众,承认普通,但拒绝沉沦于平庸.大家好,我是你们的老朋友,小KK. 满满的 ?前言 ?什么C语言?? ?数据类型?? ?变量和常量?? ?定义变量的方法?? ?变量的分类??

  8. C语言初阶(18) | 数组详解

    目录 1.数组的定义 2.一维数组 2.1一维数组的格式 2.2一维数组的初始化 2.3一维数组的使用 2.4一维数组再内存中的存储 3.二维数组 3.1二维数组的创建和初始化 3.2二维数组的使用 ...

  9. 数据结构初阶:二叉树

    二叉树 链表和数组都是线性结构,而树是非线性的结构. 树是依靠分支关系定义出的一种层次结构.社会亲缘关系和组织结构图都可以用树来形象地表示. 1. 树 1.1 树的定义 树是 n ( n ≥ 0 ) ...

最新文章

  1. Unity3D:中小型团队游戏研发的突围之道
  2. css数字发光,每日CSS_发光文本效果
  3. Java 动态调试技术原理及实践
  4. 大型网站架构学习笔记
  5. linux vim分屏:水平和垂直分屏
  6. Nacos服务端流程图
  7. 商业逻辑12讲之战略管理的逻辑
  8. 随机排列_“按字母顺序排列”其实是种随机顺序
  9. ios 拍照 实现 连拍_如何在iOS设备上使用连拍模式拍照
  10. 售前工程师的成长---一个老员工的经验之谈(5)
  11. 库存出现负数 mysql_前台支付商品成功后,sku表库存,购买数量会重复执行减操作好几次了,导致库存为负数...
  12. 江苏计算机专业接本,江苏农牧科技职业学院专接本或专转本的通知
  13. 大数据与云计算是什么关系
  14. JAVA汉字转拼音工具类
  15. oracle g1 gc,G1 GC日志分析
  16. JAVA多线程:龟兔赛跑
  17. Idea小技巧 之 折叠代码块
  18. Spring Boot+Vue项目打包部署
  19. 英语年份怎么读(2008怎么读)
  20. oracle重复名字,oracle中的名字(names for oracle)

热门文章

  1. jsjquery获取url域名及参数的方法
  2. 计算机视觉未来的挑战,搜狗斩获ICPR 2020人脸关键点检测挑战赛冠军 计算机视觉技术持续领先...
  3. DAU与GMV的差异,蛋鸡与肉鸡的区别
  4. linux服务器filesystem,linux mount报错:you must specify the filesystem type的解决方法
  5. 可盈可乐研究院 | 2019:区块链+跨境支付”新旧”势力的新一轮角力
  6. Python爬虫抓取网页图片
  7. [机器学习算法]支持向量机SVM原理简介
  8. Multi-Label Image Classification(多标签图像分类)
  9. AWS - Amazon Simple Email(ASE) 邮件服务
  10. c++中如何把任意类型的指针转化为void*