树的简介
树:一种非线性的数据结构,逻辑上是由n个结点组成的一个具有层次关系的集合.
树的定义
树是递归定义的:
任何一棵非空树,都可以划分为根和子树,例:
但子树也可以继续划分为根和子树。
直到最后的子树只能划分出根和空树。
树的相关概念
父结点与子结点/孩子结点:
以上树为例,A结点是B结点的父结点,
B结点是A结点的子结点/孩子结点.
兄弟结点:具有相同父结点的结点互称为兄弟结点;
堂兄弟结点:父结点在同一层的结点互称为堂兄弟结点;
结点的度:一个结点中含有子结点的个数(或子树的个数);
如A结点的度为3, B结点的度为2,E结点的度为0.
树的度:一棵树中,哪个结点的度最大,树的度就是那个结点的度
叶结点/终端结点:度为0的结点;
分支结点/非终端结点:度不为0的结点;
结点的层次:一般从根开始,根为第一层,根的子结点在第二层,以此类推;
树的高度:树中结点的最大层次;
祖先结点:从该结点到根结点路径上的所有结点都是该结点的祖先结点。
子孙结点:以该结点为根的子树,树中任一结点都为该结点的子孙.
自己是不是自己的祖先?看题目的认定。
树的特征
1 子树是不相交的;
2 除了根结点,其它结点有且只有一个父结点;
3 一棵N个结点的树,有(N-1)条边。
树的表示
树的一个结点既要保存自己的数据,也要能表示出与其它结点的关系。
或者说表示出所有的子结点。
struct TreeNode
{
int data;
struct TreeNode* child1;
struct TreeNode* child2;
…………………………………………
}//难以在结构体中声明所有的孩子结点
以上方案无法表示出该结点的所有子结点,除非已经知道树的度。
有一种有效的方法叫孩子兄弟表示法.
struct TreeNode
{
struct TreeNode* leftchild;//左边第一个孩子结点
struct TreeNode* rightbrother;//指向下一个兄弟结点
int data;
}
一个父亲可能有多个孩子,孩子多了照顾不过来,
于是这个父亲决定只管老大,老大管老二,老二管老三.
无论有多少个孩子结点,当前结点只管第一个孩子结点,
剩下的孩子结点由孩子的兄弟指针来表示.
二叉树简介
若一棵树中,每个结点的度最多是2,这棵树就是二叉树.
特殊二叉树
满二叉树
一棵二叉树,若每一层的结点数都达到max,它就是满二叉树.
性质1:第K层的结点数是2^(K-1)
性质2:若一棵满二叉树的高度为K,则它的结点数N为 2^K - 1
N = 2^0+2^1+2^2+……+2^(K-1) = 2^K - 1.
知道满二叉树的结点数也能推出它的高度K。
K = log(N+1).
完全二叉树
一棵二叉树的高度为K,若前(K-1)层的结点数是满的,
第K层结点数不一定满,但一定是从左到右连续的,
这棵树就是完全二叉树.
性质1:度为1的结点只有0个或1个
性质2:设高度为K,则结点数的范围是:
前K-1层是满的,第K层只有1个结点 ~ K层全满.
[2^(K-1), 2^K-1]
二叉树的普遍性质
若规定根结点的所在层数是1:
A 一棵二叉树的第k层上最多有2^(k-1)个结点
B 深度为K的二叉树最大结点数为2^K - 1
C 对任何一棵非空二叉树,度为0的结点数总是比度为2的结点数多一个
即 n0 = n2 + 1;