数据结构笔试题二
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、什么是二分法查找,编程实现。
二分法查找针对有序数列。 和中间的比较,小于往左,大于往右。