把叶子结点连成单链表

把一棵树的叶子结点从左至右链接成单链表

王道课后习题:设计一个算法将二叉树的叶结点按从左到右的顺序连成一个单链表,表头指针为head。二叉树按链式方式存储,链接时用叶结点的右指针域来存放单链表指针。

算法思想:该算法需要以从左到右的顺序遍历二叉树的叶结点,而不管是先序中序还是后续,叶结点的访问顺序都是从左到右,所以都能实现,这里我们选用中序遍历。处理第一个叶结点时,让head指向他,处理之后的结点时只需让之前的叶结点的右指针域指向他即可,遍历完所有结点后让最后一个结点的右指针域指向空,在这期间用pre来标记之前的结点。

算法代码如下

Linklist head,pre=NULL;                //定义全局变量
Linklist InOrder(BiTree bt){
    if(bt){
        InOrder(bt->lchild);
        if(bt->lchild==NULL&&bt->rchild==NULL)            //叶结点
            if(pre==NULL){                                //处理第一个结点时让head指向他
                head=bt;
                pre=bt;
            }
        else{
            pre->rchild=bt;                              //处理之后的结点只需让之前的结点右指针指向他
            pre=bt;                                      //更新pre指针
        }
        InOrder(bt->rchild);
        pre->rchild=NULL;                               //设置链表尾
    }
    return head;
}

本题重要思想:通过先中后遍历的特性来按顺序寻找叶结点,也可以推广出通过“右根左”来遍历设置从右到左的链表。

posted @ 2022-10-14 11:12  Auous  阅读(232)  评论(0)    收藏  举报