1.逻辑结构与物理结构
- 逻辑结构:数据元素之间的逻辑关系称为数据的逻辑结构。例如集合结构,线性结构,树状结构和网络结构。(堆,栈似乎同属于线性结构)
- 物理结构(存储结构):数据结构在计算机中的表示。例如顺序存储,链式存储,索引存储,散列存储。
2.顺序存储和链式存储的选择
- 顺序存储和链式存储的选择要根据具体问题来判断。
- 如果对数据的操作涉及较多的插入和删除,应选择链式存储结构。
- 如果对数据的操作涉及较多的访问,应选择顺序存储结构。
3.在用数组表示的循环队列中判断队列是空是满的边界条件
- 解决方法1:在数据结构中增设一个布尔变量来单独储存队列是空还是满。
- 解决方法2:队列中的front和rear有一个不储存具体数据。例如front为空,front+1为第一个数据,rear代表最后一个数据。这样空的条件设定为
front ==rear;
,把满的条件设定为(rear+1)%maxSize==front;
。这样就很好的区别了空与满。
4.拓扑排序算法复杂度
- 对于一个n个节点,e条边的图,算法复杂度为O(n+e)
5.完全二叉树的节点公式
- 对于一个完全二叉树,如果对节点从1开始计数,如果一个节点编号为i,那么它的左孩子为2i,右孩子为2i+1。
6.树的高度计算公式
- 如果节点数为n,那么树的高度为log2(n)向上取整再减1。
- 需要指出的是在这个公式中,默认空树的高度为-1,在有些教材中空树的高度记为0。
7.哈夫曼树节点计算公式
- 如果哈夫曼树中叶子节点数为n,那么总节点数为2n-1。
8.根据后序遍历和中序遍历结果推测树的形状
- 如果一棵树,其后序遍历为dabec,中序遍历结果为debac,求其前序遍历结果。
- 首先根据后续遍历的性质,知道c为根节点,再由中序遍历的性质知道,deba都在c的左子树中,c的右子树为空。再看c的左子树,在c的左子树中,e又为其根节点,再看中序遍历,知道d在c的左子树的左子树中,ba在c的左子树的右子树中,以此类推,可以得到整棵树。
- 因此前序遍历的结果为cedba。
9.编程问题:寻找两个节点的最近父节点
//寻找二叉树两个结点的最低共同父节点
TreeNode *FindFirstCommonParentNode(TreeNode *pRoot, TreeNode *pNodeOne, TreeNode *pNodeTwo)
{
if (NULL == pRoot)
{
return NULL;
}
if (pRoot == pNodeOne || pRoot == pNodeTwo)
{
return pRoot;
}
TreeNode *pLeft = FindFirstCommonParentNode(pRoot->m_pLeft, pNodeOne, pNodeTwo);
TreeNode *pRight = FindFirstCommonParentNode(pRoot->m_pRight, pNodeOne, pNodeTwo);
if (NULL == pLeft) //1、左子树没有找到任何一个结点,则第一个公共父节点必定在右子树,而且找到第一个结点就是最低共同父节点
{
return pRight;
}
else if (NULL == pRight) //2、右子树没有找到任何一个结点,则第一个公共父节点必定在左子树,而且找到第一个结点就是最低共同父节点
{
return pLeft;
}
else //3、分别在结点的左右子树找到,则此节点必为第一个公共父节点
{
return pRoot;
}
}
来自编程之路
10.哈夫曼树
- 叶子结点数是N时,中间节点数为N-1,总结点树为2*N-1
- 问题:已知一个哈夫曼树,允许的最大高度为4。假定已有两个叶子节点被编码为01和10,那么还有最多几个叶子节点?
- 解答:最多还有8个叶子节点。对于一棵任意的哈夫曼树,如果其高度为4,那么它的叶子节点数量最多为2的4次方,就是16个。但是我们已知两个叶子节点的编码为01和10,代表这两个叶子节点的高度只有2,因为哈夫曼树不存在一个编码是另一个编码的前缀,因此在这两个叶子节点之下没有子节点。所以比原来的结果少了(8-2)=6个节点,所以共有10个叶子节点,最多还能在找8个。