2017数据结构

作者: 听力巴士 | 来源:发表于2019-07-02 13:39 被阅读0次

选择:

非常简单,最基础的证明。

最难的一道:n层的整二叉树两个节点的最远距离是多少?

分析:
    最大距离可能一个在左子树,一个在右子树中,通过根节点;也可能出现在左/右子树中,不经过根节点。通过根节点的最大距离为左右子树深度的和加1;所以可以同时计算树的深度和最大距离。

void FindMaxDis(BSTreeNode *pNode, int &deepth, int &maxdis)
{
    if (pNode==NULL)
    {
        deepth=0;maxdis=0;
        return;
    }
    int l_deepth=0,r_deepth=0;
    int l_maxdis=0,r_maxdis=0;
 
    if (pNode->m_pleft)
        FindMaxDis(pNode->m_pleft,l_deepth,l_maxdis);
    if (pNode->m_pright)
        FindMaxDis(pNode->m_pright,r_deepth,r_maxdis);
 
    deepth = (l_deepth > r_deepth ? l_deepth : r_deepth) + 1;
 
    maxdis = l_maxdis > r_maxdis ? l_maxdis : r_maxdis ;
 
    maxdis = (l_deepth+r_deepth) > maxdis ? (l_deepth+r_deepth) : maxdis;
 
}
int FindMaxDis(BSTreeNode *pNode)
{
    int deepth, maxdis;
    FindMaxDis(pNode,deepth,maxdis);
 
    return maxdis;
}

填空:

考了一组二叉树的性质,折半二叉树的构造。
分析:
    折半查找:只适用于有序表,且限于顺序存储结构(线性链表无法进行折半查找)
(1)思想:又称二分查找,对于已经按照一定顺序排列好的列表,每次都用关键字和中间的元素对比,然后判断是在前部分还是后部分还是就是中间的元素,然后继续用关键字和中间的元素对比。
(2)时间复杂度:T(n) =O(logn)。具有n 个结点的完全二叉树的深度为,在这里尽管折半查找判定二叉树并不是完全二叉树,但同样相同的推导可以得出,最坏情况是查找到关键字或查找失败的次数也如此。其时间复杂度远好于顺序查找的时间复杂度O(n)了。

(3)程序:
Int BinSrch(RecordList l, KeyType k)  
    {  
             low = 1;  
             high = l.length;  
             while(low <= high)  
             {  
                  mid = (low + high) / 2;  
                  if(k == l.r[mid].key)  
                       return mid;  
                  else if(k < l.r[mid].key)  
                       high = mid -1;  
                  else  
                       low = mid + 1;  
             }  
             return 0;  
    }  

(4)小结:由于折半查找的前提条件是需要有序表顺序存储,对于静态查找表,一次排序后不再变化,折半查找比较适合。但对于需要频繁执行插入或删除操作的数据集来说,维护有序的排序会带来不小的工作量,则不建议使用。


判断:

依然很简单。


简答:

1.如何将一个顺序的单链表逆序?
2.20个结点折半二叉树,叶子节点都是哪几个。
3.给你几行数列,问这是什么排序方法。
4.构造哈夫曼树,求平均路径。
5.普里姆算法求最小生成树的构造。


编程:

1.在一个有序链表中插入一个数字,让它依然有序。
2.在不考虑空间的情况下,将链表中大于第一个结点的结点放到左边,小于这个结点的放到右边。(类似于火车调度算法)

相关文章

网友评论

    本文标题:2017数据结构

    本文链接:https://www.haomeiwen.com/subject/bpezcctx.html