[DS] 树的一些基本概念
树
术语
- Root 没有父节点的节点。
- Siblings 有相同父节点的节点。
- Internal node 至少有一个子节点的节点。
- External node 没有子节点的节点。
- Ancestors of a node 父节点,父节点的父节点...
- Descendant of a node 子节点,子节点的子节点...
- Depth of a node 祖先节点的个数。
- Height of a tree 所有节点中的最大深度。
- Degree of a node 子节点的个数。
- Degree of a tree 树中所有节点度的最大值。
- Subtree 一个节点和其所有子孙节点组成的树。
二叉树
定义:一个树,每个内部节点,最多只有两个子节点,每个节点的子节点是有序的,一般称为left child和right child。
递归的定义:一个树有一个单个根节点,或者一个树其根节点有两个有序的子节点,每个节点又是一个二叉树的根节点。
二叉树最大的节点数
- 某个深度的最大节点数:\(2^i\),\(i\)是深度,这个好理解,因为每层的最大节点数是\(2,4,8,16...\)这样增长的。
- 二叉树的最大节点数: \(2^{k+1}-1\),把每层相加就好\(\sum_{i=0}^k{2^i}=2^{k+1}-1\)。
叶子节点和度2节点的关系
对于非空二叉树T,\(n_0\)为叶子节点数,而\(n_2\)是度2节点数,则有\(n_0=n_2+1\)
设\(n,B\)分别为二叉树的节点总数和二叉树的分叉数,\(n_0, n_1, n_2\)分别为度0,1,2节点的个数,则有\(B+1=n\),\(B=n_1+n_2\),联立消去\(B\),则有\(n_1+2n_2+1=n\),又有\(n_0+n_1+n2=n\),则得出\(n_0=n_2+1\)。
满二叉树
给定高度\(k\),一共有\(2^{k+1}-1\)个节点的二叉树,是满二叉树。
用数字来标记二叉树,从上到小,从左到右,数字依次递增。
- 对于节点\(i\)来说,他的父节点为\(i/2\),除了\(i=1\)。
- 对于节点\(i\)来说,它的左子节点为\(2i\),除了\(2i>n\),此时其没有左子节点。又子节点为\(2i+1\)同理。
完全二叉树
相对于满二叉树来说,完全二叉树最后一层不是满的,也就是说,最后一层的节点个数不是\(2^i\)但要大于1。
二叉树的存储
两种方式,一种是链式结构,一种是连续的数组方式。
- 链式结构,每个节点是数据单元 + 两个指向子节点的指针,对于链式的结构,会有n+1个 NULL的指针
- 连续数组结构,用数组的索引来区分节点,例如A[1]是根,A[2],A[3]是A[1]的子节点
二叉树的遍历
- 先序遍历:先遍历当前节点,再遍历左子树,再遍历右子树。
- 中序遍历:先遍历左子树,再遍历当前节点,再遍历右子树。
- 后序遍历:先遍历左子树,再遍历右子树,再遍历当前节点。