1.树概念及结构
1.1 概念:
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
- 有一个特殊的结点,称为根结点,根节点没有前驱结点;
- 除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i<= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继;
- 因此,树是递归定义的
注意:树形结构中,子树之间不能有交集,否则就不是树形结构
树的相关概念 -- 用现实的树的概念 + 人类的亲缘关系来进行命名;
比较常用的概念:
节点的度:一个节点含有的子树的个数称为该节点的度;
叶节点或终端节点:度为0的节点称为叶节点;
非终端节点或分支节点:度不为0的节点;
双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;
孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;
树的度:一棵树中,最大的节点的度称为树的度;
树的高度或深度:树中节点的最大层次;
涉及的练习:
1.2 树的表示:
其中最常用的孩子兄弟表示法。
typedef int DataType;
struct Node
{
struct Node* _firstChild1; // 第一个孩子结点
struct Node* _pNextBrother; // 指向其下一个兄弟结点
DataType _data; // 结点中的数据域
};
树在实际中的运用(表示文件系统的目录树结构)
2.二叉树概念及结构
一棵二叉树是结点的一个有限集合,该集合:
1. 或者为空;
2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成;
特点:
1. 二叉树不存在度大于2的结点;
2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树;
特殊的二叉树:
1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。
2. 完全二叉树:如果树的深度为h,那么前h-1层都是结点数都达到最大值,第h层可以不满,所以满二叉树是一种特殊的完全二叉树。
二叉树的性质:
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). (是log以2为底,n+1为对数);
熟练掌握二叉树的性质可以帮助处理一些相关题目:(比如下面这个题目)
解析:
该题需要用到二叉树性质3:在任意二叉树中,度为0的节点都比度为2的节点多1个,即 n0 = n2 + 1
另外,在完全二叉树中,如果节点总个数为奇数,则没有度为1的节点,如果节点总个数为偶数,只有一个度为1的节点
因此:n0 + n1 + n2 = 1001 节点总数为奇数,没有度为1的节点
n0 + 0 + n2 = 2*n0-1 = 1001 n0 = 501