C++高级数据结构算法#树与二叉树的概念及性质

树的定义

定义 : 树是由n个节点组成的有限集合T , 其中n >= 0 . 特别的 , 若n = 0 , 则称为空树 , 如果 n > 0 则T应当满足的条件是 :

  • 1.有一个特定称为根(root)的节点 , 它只有直接后继 , 没有直接前驱 .
  • 2.除根以外的其他节点被划分为m个互不相交的有限集合T1,T2,…Tm , 其中m>=0 ,每个集合又是一棵树并称为根的子树. 每棵子树的根节点有且仅有一个前驱 , 但可以有0个或多个直接后继

注 : 直接前驱,是指该节点的前一个节点 ; 直接后继,是指该节点的下一个节点.

在这里插入图片描述

其中A是该树的根节点 , 除了A之外的其余的各个节点被分成了两个互不相交的子集 : T 1 T_1 1 = {B,D,E,F} , T 2 T_2 2 = {C,G,H,I}

一些术语 :

  • 1.节点 : 节点是树的基本构成单位 , 它由数据项及指向其他节点的分支共同组成.
  • 2.度 : 树上任意节点所拥有的子节点的数目称为该节点的度 , 或度数.
  • 3.叶子节点 : 也称作终端节点 , 即度为0的节点 .
  • 4.分支结点 : 也称作非终端结点 , 度大于0的节点.
  • 5.父节点 : 如果树中节点A是节点B的直接前驱 , 则称A是B的父节点.
  • 6.子节点 : 如果节点A是节点B的父节点 , 那么节点B就是节点A的子节点.
  • 7.兄弟节点 : 父节点相同的节点称为兄弟节点.
  • 8.子孙节点 : 树中某一节点的所有子节点 , 以及这些子节点的子节点都是该节点的子孙节点 . 从递归的角度上说 , 一棵树上的任何节点(不包括根节点)都称为根的子孙节点.
  • 9.祖先节点 : 若B是A的子孙节点 , 那么A即为B的祖先节点.
  • 10.节点的层数 : 从根节点开始计算 , 根层数为0 , 其余节点的层数为其双亲层数+1.
  • 11.树的高度或深度 : 一棵树中所有节点层数的最大值. 特别地 , 空树的高度为 -1.

二叉树的定义 :

二叉树(Binary Tree)作为一种具有特殊结构的数 , 本质上也是有限的节点的集合T , 前面介绍的术语对于它同样适用.

组成二叉树的有限节点集合T或者为一空集 , 或者是由一个根结点和两个分别被称为左子树和右子树的互不相交的有限集合组成.其中 , 左子树和右子树分别是两棵独立的二叉树 , 二叉树的每个节点最多有两个子女 , 即每个节点的度不会超过 2 ,且兄弟节点之间有左右子树之分 , 次序不能颠倒.

在这里插入图片描述

满二叉树 :

定义 : 一棵深度为 k 且有 2 ( k + 1 ) − 1 2^{(k+1)} -1 2(k+1)1个节点的二叉树称为满二叉树 . 满二叉树具有如下特点 :

  • 每层上的节点数都达到最大值 , 换言之 , 对于给定的高度 , 它是具有最多节点数的二叉树.
  • 满二叉树中不存在度数为 1 的节点 , 即除了底层的节点度数为 0 外 , 其他节点的度都是 2 .满二叉树的每个分支节点均有两棵高度相同的子树 , 且树叶都在最下面的一层上.
完全二叉树 :

定义 : 若一棵二叉树至多只有最下面的两层上节点的度数可以小于 2 , 其余各层节点的度数都等于 2,并且最下面一层上的节点都集中在最左边的若干位置上 , 则此二叉树称为完全二叉树 .

完全二叉树具有如下特点 :

  • 叶子节点仅在层次最大的两层出现
  • 对于任意节点 , 如果其右子树的高度为 h , 那么它的左子树的高度只能是 h 或者 h+1 .

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

在这里插入图片描述

二叉树的性质 :

性质1 : 对于非空二叉树 , 其第 i 层上的最大节点数目为 2 i 2^i 2i , 其中 i >= 0.
性质2 : 深度为k的二叉树至多有 2 ( k + 1 ) − 1 2^{(k+1)} -1 2(k+1)1个节点 , 其中 k >= -1.
性质3 : 在任意一棵非空二叉树中 , 若终端节点的个数为 n 0 n_0 n0 ,度为2的节点数为 n 2 n_2 n2 , 则 n 0 n_0 n0 = n 2 n_2 n2 + 1 ;
性质4 : 具有n个节点的完全二叉树的深度为 k = [ l o g 2 ( n + 1 ) ] − 1 [log_2{(n+1)}] -1 [log2(n+1)]1 .
性质5 : 如将一棵有n个节点的完全二叉树自上(根节点)向下(叶节点) , 同一层自左向右连续赋予节点编号0,1,2,…n-1 , 则对于任意下标为 i 的节点有 :

  • 若 i = 0,则 i 是根节点 , 无父节点 ; 若 i > 0 , 则 i 的父节点下标为 [(i-1)/2].
  • 若 2 * i+1 < n , 则 i 的左子女为 2 * i+1 .
  • 若 2 * i+2 < n , 则 i 的右子女为 2 * i+2 .
  • 若 i 为偶数 , 且 i != 0 , 则其左兄弟为 i-1 .
  • 若 i 为奇数 , 且 i != n-1 , 则其右兄弟为 i+1 .
  • 节点 i 所在的层次为 [log_2(i+1)] .

性质6 : 在满二叉树中 , 叶子节点的个数比分支结点个数多 1.

二叉树的遍历算法 :

1.前序遍历(VLR)

定义 : 又称为先根遍历 . 其访问规则是如果二叉树为空则进行空操作 , 否则首先访问根节点 , 然后前序遍历左子树 , 最后前序遍历右子树 .

2.中序遍历(LVR)

定义 : 又称为中根遍历 , 其访问规则是如果二叉树为空则进行空操作 , 否则首先中序遍历左子树 , 然后访问根节点 , 最后中序遍历右子树 .

3.后序遍历(LRV)

定义 : 又称为后根遍历 , 其访问规则是如果二叉树为空则进行空操作 , 否则首先后序遍历左子树 , 然后后序遍历右子树 , 最后访问根节点 .

深度优先遍历 :

深度优先遍历分为 : 先根遍历和后根遍历 .
先根遍历 : 是一种将根的访问作为第一优先级的遍历方法 . 即如果数非空 , 则访问其根节点 ; 然后从左到右先根遍历根的每棵子树.
后根遍历 : 是一种将根的访问作为第二优先级的遍历方法 . 即如果数非空 , 则从左到右后根遍历根的每棵子树 ; 然后访问其根节点.

广度优先遍历 :

定义 : 遵循的是分层访问原则 . 遍历首先访问树中深度为 0 的那一层中的节点 , 然后再访问深度为 1 的那一层的节点 …
在访问每一层节点的时候 , 遵循的原则是从左向右 . 直到树中的所有节点都被访问过 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!C语言中的数据结构算法是编写高效和可维护代码的关键。C语言提供了一些基本的数据结构,如数组和结构体,并且允许用户自定义更复杂的数据结构。在算法方面,C语言提供了各种处理和操作数据的功能。 以下是一些常见的数据结构算法的示例: 1. 数组:C语言中的数组是一种线性数据结构,可以存储相同类型的多个元素。数组可以通过索引来访问和修改其中的元素。 2. 链表:链表是一种动态数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表可以用于实现栈、队列等数据结构。 3. 栈和队列:栈和队列都是线性数据结构,具有不同的插入和删除操作顺序。栈采用先进后出(LIFO)的原则,而队列采用先进先出(FIFO)的原则。 4. :C语言中可以使用指针和结构体来实现二叉树、二叉搜索、堆等数据结构在搜索、排序等方面有广泛应用。 5. 图:图由节点和边组成,用于表示不同元素之间的关系。图可以使用邻接矩阵或邻接表来表示。 在算法方面,C语言提供了各种排序算法(如冒泡排序、插入排序、快速排序等),查找算法(如线性查找、二分查找等)和图算法(如最短路径算法、最小生成算法等)的实现。 这只是数据结构算法的一个简单介绍,如果你对特定的数据结构算法有更深入的问题,可以继续提问!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值