树和二叉树:这一章中我们从顺序式的数据结构,转向层次式的数据结构,要掌握树、二叉树的各种性质、树和二叉树的不同存储结构、森林、树和二叉树之间的转换、线索化二叉树、二叉树的应用(二叉排序树、平衡二叉树和Huffman树),重点要熟练掌握的,是森林、树以及二叉树的前中后三种遍历方式,要能进行相应的算法设计。这一部分是数据结构考题历来的重点和难点,复习时要特别关注。
一些常见的选择题考点包括:满二叉树、完全二叉树节点数的计算,由树、二叉树的示意图给出相应的遍历序列,依据二叉树的遍历序列还原二叉树,线索化的实质,计算采用不同的方法线索化后二叉树剩余空指针域的个数,平衡二叉树的定义、性质、建立和四种调整算法以及回溯法相关的问题。
常见的综合应用题考点包括:二叉树的遍历算法,遍历基础上针对二叉树的一些统计和操作(比如结点数统计、左右子树对换等等),判断某棵二叉树是否二叉排序树,以上这些都要求能用递归的和非递归的算法解决,特别要重视非递归的算法,线索化后二叉树的遍历算法,如查找某结点线索化后的前驱或后继结点的算法以及给出Huffman编码等等。
树
引入树的概念是因为vector和list没有办法兼顾静态和动态的高效性。而树将二者的优点融合起来了。树是非线性结构
树中所有边数e=所有节点r的度数之和=顶点数-1
路径长度=边数
连通图:节点之间均有路径。
树:无环连通图、极小连通图、极大无环图
任意节点都与根节点之间有唯一的路径。
特别下,空树的高度取为-1;
二叉树
- 深度为k的节点,至多2的k次方个
- 含n个节点、高度为h的二叉树中
h<n<2*2^h
- 当所有的节点都是满2的时候,就是满二叉树。
- 真二叉树:子节点数目为0或者2
多叉树转二叉树
参考这个:
https://blog.csdn.net/c20190102/article/details/69946551
- 有根有序的树都可以转为二叉树
二叉树的实现
二叉树实现的一些模板??插入删除、计算高度等?
先序遍历根左右
递归实现
//手写代码
template <typename T, typename VST> //元素类型、操作器
void travPre_R ( BinNodePosi(T) x, VST& visit ) {
//二叉树先序遍历算法(递归版)
if ( !x ) return;
visit ( x->data );
travPre_R ( x->lc, visit );
travPre_R ( x->rc, visit );
}
迭代实现
//从当前节点出发,沿左分支不断深入,直至没有左分支的节点;沿途节点遇到后立即访问
0010 template <typename T, typename VST> //元素类型、操作器
0011 static void visitAlongVine ( BinNodePosi(T) x, VST& visit, Stack<BinNodePosi(T)>& S ) {
0012 while ( x ) {
0013 visit ( x->data ); //访问当前节点
0014 S.push ( x->rc ); //右孩子入栈暂存(可优化:通过判断,避免空的右孩子入栈)
0015 x <