文章目录
前言
文章细分了各个知识点,可在目录中快速跳转。
本文介绍树与二叉树的概念与结构
一、树是什么?
1. 树的概念
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
- 最上方的称为根结点,根结点没有父节点
- 除根结点外,其余结点可以作为子树的根结点。每棵子树的根结点有且只有一个父结点,可以有0个或多个后继结点。
- 子树之间不相交
2. 树的相关概念
2.1 基本概念
节点的度:节点含有的子树的个数。如上图:A的为6
树的度:最大的节点的度。如上图:树的度为6
叶节点:度为0的节点。如上图:B、C、H、I…等节点为叶节点
分支节点:度不为0的节点。 如上图:D、E、F、G…等节点为分支节点
节点的层次:一般定义根为第一层(便于区分空树时树高为0),依次向下加1
树的高度或深度:树中节点的最大层次。 如上图:树的高度为4
森林:由m(m>0)棵互不相交的树的集合称为森林
2.2 节点的亲缘关系
父节点(双亲节点):一个节点的前驱节点为其的父节点。 如上图:A是B的父节点
子节点:一个父节点的后驱节点为其的子节点。如上图:B是A的孩子节点
兄弟节点:具有相同父节点的节点。 如上图:B、C是兄弟节点
堂兄弟节点:父节点在同一层次的节点。如上图:H、I互为堂兄弟节点
节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先
节点的子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙
3. 树的表示
树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既要保存值域,也要保存结点和结点之间的关系,实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。我们这里就简单的了解其中最常用的孩子兄弟表示法。
解读:我们只要确认每一层次的最左端节点就可以向右找到同一层次的所有(堂)兄弟节点,大大节省了时间和精力,就像养羊,只需要牵住领头羊,羊群就都被带动了。
typedef int DataType;
struct Node
{
struct Node* leftchild; // 第一个孩子结点
struct Node* rightBrother; // 指向其下一个兄弟结点
DataType data; // 结点中的数据域
};
4. 树的实际运用(表示文件系统的目录树结构)
二、二叉树
1. 二叉树概念及结构
定义:
- 树的度最大可以为2(可以不存在度为2的子树)
- 子树有左右之分,顺序不能颠倒,为有序树
分类:
- 完全二叉树: 前N-1层为满,最后一层不一定为满
- 满二叉树:全为满,是特殊的完全二叉树
2. 二叉树的性质
2.1 节点与树高的关系
- 满二叉树
- 已知 h(树高) => N(节点总数) = 2 ^ (h-1)
- 已知 N => h = log2(N+1)
- 完全二叉树
- 前N-1层为满,运用上述公式计算即可,剩下一层单独计算,节点数最少为1,最多为2^(h-1)
2.2 数组实现
2.2.1 父子节点下标关系
leftchild = parent*2 + 1 //奇数位
rightchild = parent*2 + 2 //偶数位
parent = (child - 1) / 2 //不需要区别左右孩子
2.2.2 存储方法
从上到下,从左往右依次存入数组
2.2.3 局限性
只适合完全二叉树 :非连续树,空位对应的数组位也要空出,造成空间浪费
总结
本文介绍了树和二叉树的定义和性质,如果对你有所帮助,还望点赞收藏支持博主。
文章中有什么不对的丶可改正的丶可优化的地方,欢迎各位来评论区指点交流,博主看到后会一一回复。