C++超详细讲解树与二叉树

目录
    • 树的定义
    • 树的名词解释
  • 树的表示
    • 树的存储结构
  • 二叉树的概念及结构
    • 二叉树的概念
    • 二叉树的性质
    • 二叉树的存储结构
      • 顺序存储结构
      • 链式存储结构

树的定义

Q:什么是树

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

Q:树有什么特点

有一个特殊的结点,称为根结点,根节点没有前驱结点。

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

树是递归定义的

对于树的定义还需要强调两点:

当n>0时,根结点是唯一的,不可能存在多个根结点。数据结构中的树是只能有一个根结点。

当m>0时,子树的个数没有限制,但它们一定是互不相交的。像下图中的结构就不符合树的定义,因为它们都有相交的子树。

树的名词解释

节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为3

叶节点:度为0的节点称为叶节点; 如上图:I,G,K,G,L,M节点为叶节点

非终端节点或分支节点:度不为0的节点; 如上图:B、D、C、E、F等节点为分支节点

双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点

孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点

兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点

树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为3

节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推

树的高度或深度:树中节点的最大层次; 如上图:树的高度为4

节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先

子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙

森林:由m棵互不相交的树的集合称为森林

树的表示

树的存储结构

说到存储结构,自然就会想到我们前面讲过的顺序存储和链式存储两种结构。

顺序存储结构:树中某个结点的孩子可以有多个,若将树中所有结点存储到数组中,结点的存储位置无法直接反应其逻辑关系,因此:简单的顺序存储结构是不能满足树的实现要求的

链式存储结构:链式存储结构的特点,完全可以实现对树的存储结构的表示。

表示方式:实际中树有很多种表示方式, 如:双亲表示法,孩子表示法、孩子兄弟表示法等等。我们这里就简单的了解其中最常用的孩子兄弟表示法。

代码演示

typedef int DataType;
struct Node
{
    struct Node* _firstChild1;    // 第一个孩子结点
    struct Node* _pNextBrother;   // 指向其下一个兄弟结点
    DataType _data;               // 结点中的数据域
};

图像演示

二叉树的概念及结构

二叉树的概念

Q:什么是二叉树

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

Q:二叉树有什么特点

每个结点最多有两棵子树,二叉树不存在度大于2的结点。左子树和右子树是有顺序的,次序不能任意颠倒。即使树中某结点只有一棵子树,也要区分左子树还是右子树。

Q:二叉树有什么基本形式

空二叉树只有一个根节点根节点只有左子树根节点只有右子树根节点既有左子树又有右子树

Q:特殊的二叉树有哪些

(1)满二叉树:在一颗二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。

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

二叉树的性质

性质一:在二叉树的第 i 层上至多有2^(i-1) 个结点。

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

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

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

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

如果 i=1,则结点 i 是二叉树的根,无双亲;如果 i>1,则其双亲是结点 1/2如果 2i>n,则结点 i无左孩子;否则其左孩子是结点2i如果 2i<n,则结点 i无右孩子;否则其右孩子是结点2i+1

二叉树的存储结构

顺序存储结构

顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树。因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。

链式存储结构

二叉树每个结点最多有两个孩子,所以为它分配一个数据域和两个指针域是比较自然的想法,我们称这样的链表叫做二叉链表。结点结构如图:

代码演示

typedef int BTDataType;
struct BinaryTreeNode
{
    struct BinTreeNode* _pLeft;       // 指向当前节点左孩子
    struct BinTreeNode* _pRight;      // 指向当前节点右孩子
    BTDataType _data;                 // 当前节点值域
}

到此这篇关于C++超详细讲解树与二叉树的文章就介绍到这了,更多相关C++树与二叉树内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++超详细实现二叉树的遍历

    目录 二叉树的遍历 前序遍历 中序遍历 后序遍历 层序遍历 二叉树的遍历 Q:什么是二叉树的遍历? A:二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次,且仅被访问一次. Q:二叉树有几种遍历方法? A:二叉树的遍历方法可以有很多种,如果限制了从左到右的习惯方式,那么主要分为以下四种:先序遍历,中序遍历,后序遍历,层序遍历. 前序遍历 Q:什么是先序遍历 A:先序遍历就是先访问树的根节点,再访问树的左子节点,再访问右子节点.可以想象为,从一棵二叉树根节点

  • C++ 二叉树的实现超详细解析

    目录 1.树的概念及结构(了解) 1.1树的概念: 1.2树的表示法: 2.二叉树的概念及结构 2.1二叉树的概念: 2.2特殊的二叉树: 2.3二叉树的性质: 2.4二叉树的顺序存储: 2.5二叉树的链式存储: 3.二叉树链式结构的实现 3.1二叉树的前中后序遍历: 3.2求二叉树的节点个数: 3.3求二叉树的叶子节点个数: 3.4销毁二叉树: 1.树的概念及结构(了解) 1.1树的概念: 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合.把它叫做树是因为它看

  • C++ 详解数据结构中的搜索二叉树

    目录 定义 查找某个元素 构造搜索二叉树 往搜索二叉树中插入元素 搜索二叉树删除节点 定义 搜索二叉树,也称有序二叉树,排序二叉树,是指一棵空树或者具有下列性质的二叉树: 1.若任意节点的左子树不空,则左子树上的所有节点的值均小于它的根节点的值 2.若任意节点的右子树不空,则右子树上的所有节点的值均大于它的根节点的值 3.任意节点的左右子树也称为二叉查找树. 4.没有键值相等的节点. 5.搜索二叉树中序遍历为有序数组. 结构代码实现 template<class K> struct BSTre

  • C++数据结构之搜索二叉树的实现

    目录 零.前言 1.概念 2.作用 3.迭代实现 (1)查找 (2)插入 (3)删除 4.递归实现 (1)查找 (2)插入 (3)删除 5.key/value模型的应用 (1)对应查找 (2)判断出现次数 6.总结 零.前言 了解搜索二叉树是为了STL中的map和set做铺垫,我们所熟知的AVL树和平衡搜索二叉树也需要搜索二叉树的基础,本文就来建立一棵搜索二叉树. 1.概念 搜索二叉树又称为二叉排序树,它或者是一棵空树,或者具有如下性质: 1.若其左子树不为空,则左子树上所有节点的值都小于根节点

  • C++超详细讲解树与二叉树

    目录 树 树的定义 树的名词解释 树的表示 树的存储结构 二叉树的概念及结构 二叉树的概念 二叉树的性质 二叉树的存储结构 顺序存储结构 链式存储结构 树 树的定义 Q:什么是树 A:树是一种 非线性 的数据结构,它是由 n ( n>=0 )个有限结点组成一个具有层次关系的集合.把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的. Q:树有什么特点 有一个特殊的结点,称为根结点,根节点没有前驱结点. 除根节点外,其余结点被分成M(M>0)个互不相交的集合T1.T2.…….T

  • C语言详细讲解树状数组与线段树

    目录 树状数组 动态求连续区间和 数星星 线段树 动态求连续区间和 数列区间最大值 树状数组 动态求连续区间和 给定 n 个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,b] 的连续和. 输入格式第一行包含两个整数 n 和 m,分别表示数的个数和操作次数. 第二行包含 n 个整数,表示完整数列. 接下来 m 行,每行包含三个整数 k,a,b (k=0,表示求子数列[a,b]的和:k=1,表示第 a 个数加 b). 数列从 1 开始计数. 输出格式输出若干行数字,表示 k

  • Java超详细精讲数据结构之bfs与双端队列

    目录 一.bfs 二.双端队列 三.算法题 1.kotori和迷宫 2.小红找红点 3.小红玩数组 一.bfs bfs(广度优先搜索),类似二叉树的层序遍历,利用队列完成.一般用于求最短路. 图的最短路问题: 给定一个无向图,每条边的长度都是1.求1号点到x号点的最短距离. 顶点数n 边数为m q次询问 输入x 输出1到x的最短距离. 若1号点到x不连通,则输出-1 二.双端队列 双端队列的应用(区间翻转): 对于长度为n的数组,给定一个长度为m的区间,区间初始位置为a[1]到a[m]. 3种操

  • C语言 超详细总结讲解二叉树的概念与使用

    目录 1.二叉树的概念及结构 2.二叉树链式结构的实现 1.二叉树的概念及结构 ①概念:一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成. ②二叉树的特点: 每个结点最多有两棵子树,即二叉树不存在度大于2的结点.(度最多为2) 二叉树的子树有左右之分,其子树的次序不能颠倒. ③现实中的二叉树: 当一名普通的人看到这样一颗树,可能会想:好标准的一棵树 当一个程序猿看到这样一棵树,可能会想:好像数据结构中的二叉树,并且还是颗满二叉树 ④数据结

  • Java超详细讲解排序二叉树

    目录 排序二叉树概念 排序二叉树类的定义 添加节点 中序遍历 查找节点 查找某一节点的父节点 删除节点 排序二叉树概念 二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树.是数据结构中的一类. 对于二叉排序树的任何一个非叶子节点, 要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大. 对二叉排序树进行中序遍历,结果就是按从小到大排序的. 排序二叉树类的定义 public class binarySortTree {

  • C++模板的特化超详细精讲

    目录 一.泛型编程 二.函数模板 2.1.函数模板的概念 2.2.函数模板的格式 2.3.函数模板的原理 2.4.函数模板的实例化 2.4.1.隐式实例化 2.4.2.显示实例化 三.类模板 3.1.类模板的定义格式 3.1.类模板的实例化 四.模板的特化 4.1.概念 4.2.函数模板特化步骤 4.3.类模板的特化 4.3.1.全特化 4.3.2.偏特化 一.泛型编程 我们前面已经学过函数的重载,实现了在函数名相同的情况下,实现不同的功能! 例如: void Swap(int& left, i

  • Java BOI与NIO超详细实例精讲

    目录 Java BIO 示例代码 Java NIO 代码解读 Java BIO 阻塞IO,每个客户端链接都需要一个独立的线程处理,客户端链接没关闭时,线程链接处于阻塞状态,直到客户端链接关闭 如果客户端链接没有读取到数据,链接就会一直阻塞住,造成资源浪费 示例代码 开发一个ServerSocket服务端,通过telnet链接发送信息 import java.io.IOException; import java.io.InputStream; import java.net.ServerSock

  • C++可扩展性与多线程超详细精讲

    目录 一.可扩展性和多线程 二.线程示例 一.可扩展性和多线程 基于 Boost.Asio 之类的库开发程序与通常的 C++ 风格不同.可能需要更长时间才能返回的函数不再按顺序调用. Boost.Asio 不调用阻塞函数,而是启动异步操作.操作完成后应该调用的函数现在在相应的处理程序中调用.这种方法的缺点是顺序执行函数的物理分离,这会使代码更难理解. 诸如 Boost.Asio 之类的库通常用于实现更高的效率.无需等待操作完成,程序可以在其间执行其他任务.因此,可以启动多个同时执行的异步操作——

  • C语言 超详细讲解算法的时间复杂度和空间复杂度

    目录 1.前言 1.1 什么是数据结构? 1.2 什么是算法? 2.算法效率 2.1 如何衡量一个算法的好坏 2.2 算法的复杂度 2.3 复杂度在校招中的考察 3.时间复杂度 3.1 时间复杂度的概念 3.2 大O的渐进表示法 3.3 常见时间复杂度计算举例 4.空间复杂度 5. 常见复杂度对比 1.前言 1.1 什么是数据结构? 数据结构(Data Structure)是计算机存储.组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合. 1.2 什么是算法? 算法(Algorit

随机推荐