1)树的相关概念
- 节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6;
- 叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点;
- 非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G...等节点为分支节点;
- 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点;
- 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点;
- 兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点;
- 树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6;
- 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
- 树的高度或深度:树中节点的最大层次; 如上图:树的高度为4;
- 堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点;
- 节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先;
- 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙;
- 森林:由m(m>0)棵互不相交的树的集合称为森林;
2)特殊的二叉树
- 满二叉树:每一层的结点数都是最大值,若其层数为k,则节点总数为 2^k - 1。
- 完全二叉树:对于层数为k、结点数为n的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称之为完全二叉树。满二叉树就是一种特殊的完全二叉树。(按照根、左、右的顺序,中间不能有缺的)
3)二叉树的性质
- 若规定根节点的层数为1,则一棵非空二叉树的第 i 层上最多有 2^(i-1) 个结点;
- 若规定根节点的层数为1,则深度为 h 的二叉树的最大结点数是 2^h - 1;
- 对任何一棵二叉树, 如果度为0的叶结点个数为m, 度为2的分支结点个数为n,则有m=n+1;
- 若规定根节点的层数为1,具有n个结点的满二叉树的深度,
- 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为 i 的结点有:若i>0,i位置节点的双亲序号:(i-1)/2;若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子;若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子
4)二叉树的存储结构
- 顺序存储:数组,只适合表示完全二叉树,现实中只有“堆”才会用数组来存储;
- 链式存储:链表,每个结点有数据域、左指针、右指针。链式结构除二叉链表外,还有三叉链表,即还有一个指针指向parent,在红黑树等告诫数据结构中会涉及。
5)堆
这里说的堆是一种数据结构,与操作系统虚拟进程地址空间中的堆是两码事,不要混淆。
堆的概念:在一个集合中,将所有元素按照完全二叉树的顺序存储方式(从根节点开始,从左往右,一层一层往下)存储在一个一维数组中,并满足 K(i)<=K(2i+1) 且 K(i)<=K(2i+2) (或者K(i)>=K(2i+1) 且 K(i)>=K(2i+2) )。将根节点最大的堆叫做大堆,根节点最小的堆叫做小堆。
堆的实现:向下调整算法(时间O(N) 空间O(h)) / 向上调整算法(O(N*logN))。
堆排序:升序——建大堆,降序——建小堆。
TopK问题:解决思路:1. 前K个数,见小堆;2. 后N-K个数,依次比较,如果比堆顶大,就替换它进堆;3. 最后该小堆就是最大的前K个。
6)二叉树的遍历
注意在前序、中序、后序的遍历过程中,要递归,进栈帧!层序不用递归,按队列(先进先出)规则即可。
- 前序:根、左、右
- 中序:左、根、右
- 后序:左、右、根
- 层序:层序遍历就是从所在二叉树的根节点出发,首先访问第1层的树根节点,然后从左到右访问第2层上的节点,接着是第3层的节点,以此类推,自上而下,自左至右逐层访问树的结点。核心思想:上一层出时,带下一层进队,队列为空结束。