数据结构-线索化二叉树 – leemoaly

   盈丰娱乐

鉴于带n个植物的节的二叉树,使用双叉链式仓库作曲时,每个植物的节有两个伸出场地,总普通2n个伸出场地。,而唯一的n-1个植物的节被无效伸出意味(n个植物的节唯一的根植物的节没被无效伸出域意味)

照着,总普通n 1个空伸出域。,形成留空隙奢侈。

遍历两叉树所大发脾气的序列是长度的的。。免得这些空链域用于仓库预兆和后原动力顺序,如此走就手巧的多了。。

先连结:具有正中序列线索的两叉树的草图历程。对算法手巧的性的投合心意。

鉴于区分的穿越方式,大发脾气区分的遍历长度的序列。重行明确两叉树的植物的节如次所示

typedef struct node
{    ElemType data;          //植物的节档案场地int ltag,rtag;            //加法心情用脚踩踏struct node *lchild;    //摆布代表左植物的节当LTAG = 0,= 1是一体先兆植物的节树表现没左植物的节的摆布孩子struct node *rchild;    //rchild代表一直的植物的节当rtag命令= 0,rtag命令= 1表现没一直rchild代表植物的节的继位植物的节
} TBTNode;//线索数的植物的节典型的明确

为了手巧的算法的设计,又加法了一体头部植物的节。。头植物的节档案场地是空的。,Lchild提示,根植物的节没线索,0集树,和rchild读出末版一体植物的节在必然的各态历经性质,rtag=1。

穿越相同的棵树的方式区分。,况且区分的线索树。。两叉树的三种序和后序,因而线索树也有一体前序线索树,正中序线索树,三种后序线索树。

线索树的实质是遍历一棵二叉树。,反省其说得中肯哪一个在遍历现在植物的节的伸出场地是空的,把它们适合一体前驱波或一体空的后原动力植物的节。。

在三心情二叉树

先序盈丰优德娱乐查找一体植物的节的前序继位植物的节简略如序心情树 让现在植物的节是p,当P>rtag命令= = 1人们确信,P>rchild代表一体继位植物的节,此刻只需断定其说得中肯哪一个读出了头植物的节root若是代表p执意先序遍历说得中肯末版一体植物的节。而当p->rtag==0若p->ltag==1则p的继位植物的节执意p->rchild要不然继位植物的节是p->lchild。

引言前驱波植物的节遍历植物的节的中序是不容易的,你可以从第一组线索中预告B。、当不确信父点时,不克不及断定C的预先警告的植物的节。,为dgef四点,事实上确信双亲了。。

image

后序线索树也在同一的成绩。。找到一体后序序植物的节却找到了后续是不容易的。

照着,在现实使用中,先序线索和岗位序列,正中按次心情比得上。按次线索显示证据前体和继位植物的节的方式如次。

image

image

正中序列心情顺序单步调试历程

从上面的图中,人们确信植物的节d左子读出,而D->ltag=1,因而人们确信D没前体植物的节,而D->rchild=G!=root且D->rtag==0而鉴于D的右子树关于唯一的一体植物的节G因而G是D的后序植物的节要不然应该是D的右子树中序遍历下的第一体植物的节是D的继位植物的节。

image

原封不动的加密:

//著名的人物:exp7-5.cpp
#include 
#include <malloc.h>
#define MaxSize 100
typedef char ElemType;
typedef struct node
{    ElemType data;          //植物的节档案场地int ltag,rtag;            //加法心情用脚踩踏struct node *lchild;    //摆布代表左植物的节当LTAG = 0,= 1是一体先兆植物的节树表现没左植物的节的摆布孩子struct node *rchild;    //rchild代表一直的植物的节当rtag命令= 0,rtag命令= 1表现没一直rchild代表植物的节的继位植物的节
} TBTNode;//线索数的植物的节典型的明确
//确立或使安全两叉树void CreateTBTNode(TBTNode * &b,char *STR)
{    TBTNode ST [为],*p=NULL;
    int top=-1,k,j=0;  
    char ch;
    b=NULL;                //首次的两棵叉树是空的。
    ch=STR
    while (CH!=''\0'')    //无扫描时间
    {    switch(CH) 
        {
        case''(''顶部   ;st [顶部] = p;k1; break;        //为左植物的节case'')'':top--;break;
        case'','':k=2; break;                    //一直的结default:p=(TBTNode *)malloc(sizeof(TBTNode));
                p->data=ch;p->lchild=p->rchild=NULL;
                if (b==null)                    //p是两叉树的根植物的节。
                    b=p;
                else//曾经引起了两个叉根植物的节。
                {    switch(k) 
                    {
                    case1ST [顶] ->摆布= Pbreak;
                    case2ST [顶] -> rchild = Pbreak;
                    }
                }
        }
        j++;
        ch=STR
    }
}
//出口两叉树void DispTBTNode(TBTNode *b)
{    if (b!=null)
    {    printf("%c",b->档案)
        if (b->lchild!=NULL || b->rchild!=null)
        {    printf("(");
            DispTBTNode(b->摆布)
            if (b->rchild!=null) printf(",");
            DispTBTNode(b->rchild);
            printf(")");
        }
    }
}
TBTNode *pre;                        //全程变量void Thread(TBTNode *&p)
{    if (p!=null)
    {    线索(P->摆布)            //左子树的线索if (p->lchild==null)        //先兆线索
        {    p->lchild=pre;            //现在植物的节的预兆线索
            p->ltag=1;
        }
        else p->ltag=0;
        if (pre->rchild==null)        //成的线索
        {    pre->rchild=p;            //引起先兆植物的节的成的线索
            pre->rtag=1;
        }
        else pre->rtag=0;
        pre=p;
        线索(P->rchild);            //右子树线索    }
}
//发生中序盈丰优德娱乐
TBTNode *CreateThread(TBTNode *b)        //中序盈丰优德娱乐
{    TBTNode *root;
    root=(TBTNode *)malloc(sizeof(TBTNode));    //确立或使安全根植物的节
    root->ltag=0;root->rtag=1;
    root->rchild=b;
    if (b==null)                //空二叉树
        root->lchild=root;
    else
    {    root->lchild=b;
        pre=root;                //前是P的前体植物的节。,心情添加
        线索(b)                //中序遍历盈丰优德娱乐
        pre->rchild=root;        //末版处置,向根植物的节添加一线索
        pre->rtag=1;
        root->rchild=pre;        //根植物的节右线索    }
    return root;
}
void InOrder(TBTNode TB)        //高价地thinorder算法{
    if (TB->lchild!=NULL && tb->ltag==0)    //有一体左翼的孩子
        为了(TB摆布)
    printf("%c ",tb->档案)
    if (TB->rchild!=NULL && tb->rtag==0)    //有个好孩子
        为了(TBrchild);
}
void ThInOrder(TBTNode TB)        //正中阶重新提起算法{
    为了(TB->摆布)
}
void ThInOrder1(TBTNode TB)    //正中阶非重新提起算法
{    TBTNode *p=tb->lchild;        //读出根植物的节while (p!=TB)
    {    while (p->ltag==0) p=p->lchild;
        printf("%c ",p->档案)
        while (p->rtag==1 && p->rchild!=TB)
        {    p=p->rchild;
            printf("%c ",p->档案)
        }
        p=p->rchild;
    }
}
void DestroyTBTNode1(TBTNode TB)    //高价地DestroyTBTNode算法{
    if (TB!=null)
    {
        if (TB->lchild!=NULL && tb->ltag==0)  //有一体左翼的孩子  
            DestroyTBTNode1(TB->摆布)
        if (TB->rchild!=NULL && tb->rtag==0)  //有个好孩子  
            DestroyTBTNode1(TB->rchild);
        free(TB);
    }
}
void DestroyTBTNode(TBTNode TB)    //排放中序盈丰优德娱乐的拥有植物的节{
    DestroyTBTNode1(TB->摆布)
    free(TB);
}
void main()
{    TBTNode *b,*tb;
    CreateTBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");     
    printf("二叉树:"disptbtnode printf(B);"\n");
    tb=Create线索(b)
    printf("线索的序列按次:n");
    printf("    重新提起算法:");Th为了(TB);printf("\n");
    printf("  非重新提起算法:");ThInOrder1(TB);printf("\n");
    DestroyTBTNode(TB);
}

线索

没有评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注