1、设计一个尽可能的高效算法输出单链表的倒数第K个元素。
2、后序遍历最后访问根结点,即在递归算法中,根是压在栈底的。采用后序非递归算法,栈中存放二叉树结点的指针,当访问到某结点时,栈中所有元素均为该结点的祖先。本题要找p和q的最近共同祖先结点r,不失一般性,设p在q的左边。后序遍历必然先遍历到结点p,栈中元素均为p的祖先。将栈拷入另一辅助栈中。再继续遍历到结点q时,将栈中元素从栈顶开始逐个到辅助栈中去匹配,第一个匹配(即相等)的元素就是结点p和q的最近公共祖先。
typedefstruct
{BiTreet;inttag;//tag=0表示结点的左子女已被访问,tag=1表示结点的右子女已被访问}stack;
stacks[],s1[];//栈,容量够大
BiTreeAncestor(BiTreeROOT,p,q,r//求二叉树上结点p和q的最近的共同祖先结点r。{top=0;bt=ROOT;while(bt!=null||top>0
{while(bt!=null&&bt!=p&&bt!=q//结点入栈{s[++top].t=bt;s[top].tag=0;bt=bt->lchild;}//沿左分枝向下
if(bt==p//不失一般性,假定p在q的左侧,遇结点p时,栈中元素均为p的祖先结点{for(i=1;i<=top;i++s1[i]=s[i];top1=top;}//将栈s的元素转入辅助栈s1保存if(bt==q//找到q结点。
for(i=top;i>0;i--//;将栈中元素的树结点到s1去匹配{pp=s[i].t;
for(j=top1;j>0;j--
if(s1[j].t==pp{printf(“p和q的最近共同的祖先已找到”;return(pp;}}
while(top!=0&&s[top].tag==1top--;//退栈
if(top!=0{s[top].tag=1;bt=s[top].t->rchild;}//沿右分枝向下遍历}//结束while(bt!=null||top>0return(null;//q、p无公共祖先}//结束Ancestor
3、设一棵二叉树的结点结构为(LLINK,INFO,RLINK,ROOT为指向该二叉树根结点的指针,p和q分别为指向该二叉树中任意两个结点的指针,试编写一算法ANCESTOR(ROOT,p,q,r),该算法找到p和q的最近共同祖先结点r。4、编程实现单链表的就地逆置。
23.在数组A[1..n]中有n个数据,试建立一个带有头结点的循环链表,头指针为h,要求链中数据从小到大排列,重复的数据在链中只保存一个.
5、有一种简单的排序算法,叫做计数排序(countsorting)。这种排序算法对一个待排序的表(用数组表示进行排序,并将排序结果存放到另一个新的表中。必须注意的是,表中所有待排序的关键码互不相同,计数排序算法针对表中的每个记录,扫描待排序的表一趟,统计表中有多少个记录的关键码比该记录的关键码小,假设针对某一个记录,统计出的计数值为c,那么,这个记录在新的有序表中的合适的存放位置即为c。(1(3分给出适用于计数排序的数据表定义;
(2(7分使用Pascal或C语言编写实现计数排序的算法;(3(4分对于有n个记录的表,关键码比较次数是多少?(4(3分与简单选择排序相比较,这种方法是否更好?为什么?
6、在有向图G中,如果r到G中的每个结点都有路径可达,则称结点r为G的根结点。编写一个算法完成下列功能:(1).建立有向图G的邻接表存储结构;(2).判断有向图G是否有根,若有,则打印出所有根结点的值。
7