问答题
已知二叉树的链表存储结构定义如下:TYPE bitreptr=^bitrenode;bitrenode:record data:char; 1chi ld, rchi 1d:bitrept.r END;编写一个递归算法,利用叶结点中空的右链指针域rchild,将所有叶结点自左至右链接成一个单链表,算法返回最左叶结点的地址(链头)。【清华大学1997三(10分)】
【正确答案】正确答案:叶子结点只有在遍历中才能知道,这里使用中序递归遍历。设置前驱结点指针pre,初始为空。第一个叶子结点由指针head指向,遍历到叶子结点时,就将它前驱的rchild指针指向它,最后叶子结点的rchild为空。核心语句段如下: if(bt){InOrder(bt一>Ichild); //中序遍历左子树 if(bt一>Ichild==null&&bt一>rchild==null) //叶子结点 if(pre==null){head=bt;pre=bt;) //处理第一个叶子结点 else{pre一>rchild=bt;pre=bt;) //将叶子结点链入链表 InOrder(bt一>rchild); //中序遍历右子树 pre一>rchild=null ; //设置链表尾 } 时间复杂度为O(n),辅助变量使用head和pre,栈空间复杂度为O(n)。
【答案解析】