数据结构笔试题二

1、C++编成求二叉树的深度;

int binTreeDepth(link *head){
   int depthl=0,depthr=0;
   if(head==null)
               return 0;
   else{
              if ((head->left)!=null)
                     depthl = 1 + binTreeDepth(head->left);
              if ((head->right)!=null)   
                     depthr = 1 + binTreeDepth(head->right);
              return depthl>depthr?depthl:depthr;
   }
}

2、把一个链表反向(递归,非递归都写一遍)。

递归:
link* inverse(link* L){
    if(!L)||(!L->next){   
       return L;     
     }                                          //recursion exit
    link h = inverse(L->next);
    L->next->next=L;                  //inverse
    return h;
}

非递归:
inverse(link* head){
     link p,q,r;
     p = head;       //head--------current node
     q = p->next;    //first node
     r = q->next;      //seconde node
     head->next=null;
     while(p->next){
       q->next=p;
       p=q;         //index current node one by one
       q=r;          //
       if(r==null){
          head=q;
          break;
       }
       else
          r=r->next;
     }
}

3、哪种结构,平均来讲,获取一个值最快 b
a. binary tree
b. hash table
c. stack

4、哈希表和数组的定义,区别,优缺点
哈希函数是一个映象,即:将关键字的集合映射到某个地址集合上,它的设置很灵活,只要这个地址集合的大小不超出允许范围即可。 
5、下面哪种排序法对12354最快--插入排序应该最快。其次是快速排序,归并排序。
a quick sort
b.buble sort
c.merge sort
       快速排序:有一个划分元素,该元素左边的所有元素都小于它,右边的所有元素都大于它。
       冒泡排序:依次比较相邻的两个数,将大数放在前面,小数放在后面。即首先比较第1个和第2个数,将大数放前,小数放后。这样一趟之后,最小的数就放在了最后面。
       归并排序:将两个有序的数列合并成一个
       希尔排序:基本思想:将整个无序序列分割成若干小的子序列分别进行插入排序。序列分割方法:将相隔某个增量h的元素构成一个子序列。在排序过程中,逐次减小这个增量,最后当h减到1时,进行一次插入排序,排序就完成。增量序列一般采用:ht=2t-1,1≤t≤[log2n],其中n为待排序序列的长度。
      堆排序:
      基数排序:

6、排序二叉树插入一个节点或双向链表的实现
排序二叉树:左小于根,根小于右。左右又分别是排序二叉树。
前序遍历:根左右    中序遍历:左根右       后序遍历:左右根
排序二叉树插入一个结点:大于左,往右找,小于右往左找,递归实现。
public void insert(Root r, element e){
          if(r>e){
            if(r.left!=null){
               insert(r.left,e);
            }
            else
               r.left = e;
          }else if(r<=e){
            if(r.right!=null){
               insert(r.right, e);
            }
            else 
               r.right = e;
          }
}

7、给两个变量,如何找出一个带环单链表中是什么地方出现环的
   两个指针,一个步长为1,一个步长为2,重合的地方就是环出现的地方。

8、什么是二分法查找,编程实现。
   二分法查找针对有序数列。   和中间的比较,小于往左,大于往右。

posted on 2014-05-24 10:49  笑侃码农  阅读(632)  评论(0编辑  收藏  举报