简述:二叉树的内容较为复杂 初步了解思维导图如下 本篇优先叙述二叉树的概念及性质部分 对于堆和二叉树的链式结构将在之后两篇分别叙述。
目录
树的概念:
首先我们明确什么是树?
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
之前我们所学的链表、顺序表都是线性结构,而树是一种非线性的结构,这是与之前有所不同的。
因为看起来像倒挂的嘛 所以树的根在哪? 如上图A 就是整个树的根,向下延伸,D-H-I又可以形成一棵子树 ,那么此时D又是子树的根。
关于树的一些概念:
这里要详细看,不然下面的性质看起来会很吃力
如何表示树:
最简单的表示方法是左孩子右兄弟表示法:
typedef int DataType;
struct Node
{
struct Node* _firstChild1; // 第一个孩子结点
struct Node* _pNextBrother; // 指向其下一个兄弟结点
DataType _data; // 结点中的数据域
};
二叉树
什么是二叉树?
就是只有两个叉的树
官方一点就是
一棵二叉树是结点的一个有限集合,该集合:
1. 或者为空
2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成
特殊二叉树:
除去空树之外,-- 就是根节点也是NULL
有两种特殊二叉树:
满二叉树:
就是挂的满满登登的二叉树 每个节点都有两个子节点 看图->
完全二叉树:
除去最后一层 其他都满满登登 最后一层也是从左到右连续都有
满二叉树其实也是完全二叉树的一种情况 看图->
二叉树的性质:
1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1)个结点.
2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2^h - 1
3. 对任何一棵二叉树, 如果度为0其叶结点个数为 , 度为2的分支结点个数为 ,则有n0=n2+1
4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=log(n+1) (ps: 是log以2
为底,n+1为对数)
5. 完全二叉树最多只有一个度为1的节点。6.用顺序结构(下面会提及)存储时
左孩子节点等于父亲节点*2+1
右孩子节点等于孩子节点*2+2
父亲节点等于(孩子节点-1)/2
二叉树的存储结构:
顺序存储:
顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。
注:这种情况只适用完全二叉树,
否则会造成较大的空间浪费。
链式存储:
这里采用的“左孩子右孩子”法
typedef int BTDataType;
struct BinTreeNode
{
struct BinTreeNode* _pLeft; // 指向当前节点左孩子
struct BinTreeNode* _pRight; // 指向当前节点右孩子
BTDataType _data; // 当前节点值域
}