目录
1.树的概念及其结构
1.1什么是树
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。
1.2树的相关概念
- 节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6
- 叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点
- 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点
- 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点
- 树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6
- 树的高度或深度:树中节点的最大层次; 如上图:树的高度为4
- 节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先
- 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙
1.3树的表示
树的表示有以很多种:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法
这里说明下常用的孩子表兄弟示法
孩子兄弟表示法:
代码:
typedef int DataType; struct Node { struct Node* _firstChild1; // 第一个孩子结点 struct Node* _pNextBrother; // 指向其下一个兄弟结点 DataType _data; // 结点中的数据域 };
该结构体中成员为:第一个孩子节点,下一个兄弟节点,数据域
思想:
孩子节点:根节点只管第一个孩子节点
兄弟节点:第一个孩子节点指向根节点的另一个孩子节点
数据域:存储数据
2.二叉树的概念及其结构
2.1什么是二叉树?
二叉树是一种常见的树状数据结构,它由节点组成,每个节点最多有两个子节点
2.2二叉树的分类
1.满二叉树:每一个层的结点数都达到最大值(假设该二叉树层数为K,节点总数:2^K-1)
2.完全二叉树:除了最后一层,其他层的节点都被完全填满,并且最后一层的节点从左到右连续排列。
2.3二叉树的性质
1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1) 个结点.
2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2^h-1 .
3. 对任何一棵二叉树, 如果度为0其叶结点个数为n0 , 度为2的分支结点个数为n2,则有 n0=n2 +1
4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h= .log(n+1) (ps: 是log以2
为底,n+1为对数)5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有
- 双亲序号:(i-1)/2 (i>0)
- 左孩子序号:2i+1 (2i+1<n)
- 右孩子序号:2i+2 (2i+2<n)
2.4二叉树的存储结构
二叉树顺序结构实现:二叉树顺序结构实现(堆)
1.顺序存储:
顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储。
代码:
typedef struct Heap { HPDataType* a;//定义数组 int size; int capacity; }HP;
二叉树链式结构实现:二叉树链式结构实现
2.链式存储
二叉树的链式存储结构是指,用链表来表示一棵二叉树。通常链表中每个节点由3个域组成:
数据域,左指针域,右指针域
代码:
typedef int BTDataType; // 二叉链 struct BinaryTreeNode { struct BinTreeNode* _pLeft; // 指向当前节点左孩子 struct BinTreeNode* _pRight; // 指向当前节点右孩子 BTDataType _data; // 当前节点值域 };