leiyahui

纸上得来终觉浅,绝知此事要躬行
二叉树的存储结构

一 二叉树的顺序存储结构

将二叉树从跟节点开始依次存入连续的存储单元,如果一个节点为空则在数组中存入空值,以明确位置。(由节点的物理位置明确节点之间的关系)

顺序存储结构优点是完全适合二叉树的存储,缺点是当遇到单斜树时就会浪费存储空间。

#define maxszie 1000
typedef datatype sqtree[maxsize]
构造二叉树的顺序存储结构的算法
void CreateBTree (sqtree bt) //按照二叉树依次顺序读入元素,(虚节点是@,结束符是#),建立顺序存储结构,bt[0]未用到
{
    int i=1;
    datatype ch;
    ch=getchar();  //读入元素
    while(ch!='#')
    {
        bt[i]=ch;
        i++;
        ch=getchar();
    }
    b[i]='#';
    
}

 二 二叉树的链式存储结构

节点应包括三个域

data Lchild Rchild

data是这个节点的数据,Lchild,RChild存放指向左右子节点的指针。

有时候为了便于检索双亲节点会增加一个指向双亲的指针,Paraent域

(1)插入算法    

//按照层次顺序依次输入节点

typedef char datatype
typedef struct Bnode
{
    datatype data;
    struct Bnode* LChild,*RChild;
}Btnode,*BTptr;
BTptr CreateBtree(BTptr BT)
{
    BTptr p,q;
    int i=0;
    char ch;
    ch=getchar();
    while(ch!='#')
    {
        p=NULL;
        if(ch!='@')    //如果输入的数值为@的话,则新节点为NULL,否则再申请新地址
        {
            p=(BTptr)malloc(sizeof(Btnode));
            p->data=ch;
            p->LChild=NULL;
            p->RChild=NULL;
        }
        i++;
        Enqueue(Q,p);
        if(i==1)
        {
            BT=p;    //使根节点指向第一个输入的元素
        }
        q=GetTop()
        if(q&&p)
        {
            if(i%2==0)
                q->LChild=p;        //i为偶数的时候为双亲的左节点
            else                    //否则为右节点
            {
                q->RChild=p;
                DelQueue(Q,q);  //当前双亲处理完,从队列中删除
            }
                
        }
        ch=getchar();
    }
    return BT;
}

posted on 2015-11-22 01:22  雷大叔  阅读(235)  评论(0)    收藏  举报