将二叉树的叶结点创建为带头结点的双链表

题目

编写一算法

  • 利用叶结点中的空指针域将所有叶结点链接为一个带有头节点的双链表
  • 算法返回头节点的地址

代码

/**
* 编写一算法,利用叶结点中的空指针域将所有叶结点链接为一个带有头节点的双链表
* 算法返回头节点的地址
**/

#include <iostream>
using namespace std;
typedef char ElemType;

typedef struct TNode{
    
    
    ElemType data;
    struct TNode *lchild,*rchild;
}TNode,*BiTree;
void createBiTree(BiTree &T){
    
    
    ElemType e;
    cin>>e;
    if(e=='#'){
    
    
        T=NULL;
        return;
    }
    T=(TNode *)malloc(sizeof(TNode));
    T->data=e;
    createBiTree(T->lchild);
    createBiTree(T->rchild);
}
void dispBiTree(BiTree T){
    
    
    if(T==NULL)
        return;
    cout<<T->data<<' ';
    dispBiTree(T->lchild);
    dispBiTree(T->rchild);
}

//算法主体
BiTree head=NULL,pre;
void createLeafList(BiTree &T){
    
    
    if(T){
    
    
        createLeafList(T->lchild);
        if(T->lchild==NULL&&T->rchild==NULL){
    
    
            if(head==NULL){
    
    
                head = (TNode *)malloc(sizeof(TNode));
                head->lchild=NULL;
                head->rchild=T;
                T->lchild=head;
                pre=T;
            }else{
    
    
                T->lchild=pre;
                pre->rchild=T;
                pre=T;
            }
        }
        createLeafList(T->rchild);
        pre->lchild=NULL;
    }
}



int main() {
    
    
    BiTree T;
    createBiTree(T);
    dispBiTree(T);
    createLeafList(T);
    cout<<endl;
    for(TNode *p=head->rchild;p!=NULL;p=p->rchild){
    
    
        cout<<p->data<<" ";
    }
    return 0;
}

运行效果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/niulinbiao/article/details/127875725