1.设str1和str2分别是指向两个单词所在单链表的头结点,请设计一个时间上尽可能高效的算法,找出str1和str2所指向两个链表共同后缀的起始位置(如上图中指针p所指向的结点位置)。
int length(LinkList H){ //求链表长度
LinkList p=H;
int count=0;
while(p->next!=NULL){ //!!!!!!!!!带头结点,头结点不算在链表长度里,所以count少加 1
p=p->next;
count++;}
return count;
}
LinkNode *find(LinkList str1,LinkList str2){
LinkNode *p=str1;
LinkNode *q=str2;
int len1,len2;
len1=length(str1);
len2=length(str2);
for(;len1>len2;len1--)
p=p->next;
for(;len1<len2;len2--)
q=q->next;
whlie(p->next!=NULL&&p->next!=q->next){
p=p->next;
q=q->next;
}
return p->next;
}
2.设计判断二叉树是否为二叉排序树的算法。
int Is_bst(BTree T){
BTree p=T;
KeyType pre=minval;
PSeqStack s;
s=Init_SeqStack();
while(p||!Empty_SeqStack(s)){ //p不为空或者s不为空
if(p){ //若p不为空
Push_SeqStack(s,p); //p进栈
p=p->lchild;
}
else{
Pop_SeqStack(s,&p); //弹出栈顶元素p
if(p->data<pre) reutrn 0; //pre不是一个结点,而是结点的值(data),所以要写p->data!!!!!!!!
pre=p->data; //把p的data赋值给pre,而不是把p赋值给pre!!!!!!
p=p->rchild;
}
}
return 1;
}