中序线索二叉树创建及其遍历 – ichengs

经过反省各式各样的二元系列表,不尊重叉树的使符合怎样,空链接实地的的总量不变的大于非空链的总量。。正确的说,N个混合词的二元系列表具有2n链接实地的,非空链接实地的是n-1,纵然有1个空链接实地的。。列举如下图所示。


    从此,礼物了一种办法,应用原始空链接实地的存储器导游,要点树中如此等等硬块。摆布导游叫做线索。。

理睬,PTR要点二元系列表射中靶子混合词。,上面是修建线索的合格的:

(1)即使PTR>LCHORE是空的,在腰部遍历中存储器要点混合词的前体混合词。摆布混合词称为PTR的腰部预报器体。;

    (2)即使ptr->rchild为空,在腰部遍历SE中存储器要点混合词的继位混合词。摆布混合词称为PTR的腰部序列。;

    显然,在决定孩子们内幕的的哪独身为左翼分子
预报器,孩子们内幕的的哪独身指右方的的孩子或成功人?,必要分别的要旨。从此,在每个混合词上添加两个附加制表域LTAG和RTAG,理睬,LTAG和RTAG最适当的区域。
0或1位数的乔治英国数学家和逻辑学家变量,它比导游变量如LCHORD和RPHAL必要更少的内存。。混合词妥协列举如下。


    内幕的:

(1)当LTAG为0时,左混合词要点混合词,在1:00要点混合词的预先的警告;

(2)当RTAG为0时,要点该混合词的右子混合词为,在1:00要点混合词的继任者。;

(3)为了前述的图的二元系列表图,咱们可以修正I。

1.树混合词采取class规定,class bintree{};

class bintree
{
public:
    char data;
    bintree *leftchild,*rightchild;//存储器摆布混合词
    int lefttag,右制表;//制表左、右混合词作为导游或线索,1要旨线索。,0表现导游。
};

2.率先确立或使安全一颗二叉树

输入包含共同的。,余地离开的混合词,二叉树的改编遍历次,每个混合词都是x(y)的齐式。,努姆),X表现混合词。,Y代表父混合词。,num是0。,1,二者经过,0 表现根混合词,1表现为父混合词的左子混合词,2代表父混合词的右分岔。输入是行。,这是中间层遍历的发生。

输入:A(0),0) B(A),1) C(A),2) D(B,1) E(B,2) F(C,1) G(D,1) H(D,2)

输入:G D H B E A F C

确立或使安全二叉树的行为准则可以基础。以下是人事栏适用于:

bintree *createtree(){
    bintree *root = new bintree;
    bintree *parent;
    string in_string;
    while(cin>>in_string){
        if(in_string[2]-''0''==0){
            root->data = in_string[0];
            root->leftchild = root->rightchild = NULL;
            root->lefttag = root->righttag=0;
            continue;
        }
        parent = 查找(根),in_string[2]);
        if(in_string[4]-''0''==1){
            bintree *newnode = new bintree;
            newnode->data = in_string[0];
            newnode->leftchild = newnode->rightchild = NULL;
            newnode->lefttag = newnode->righttag=0;
            parent->leftchild = newnode;
        }elseif(in_string[4]-''0''==2){
            bintree *newnode = new bintree;
            newnode->data = in_string[0];
            newnode->leftchild = newnode->rightchild = NULL;
            newnode->lefttag = newnode->righttag = 0;
            parent->rightchild = newnode;
        }
        if(格查尔)''\n'')
            break;
    }
    return root;
}

三。写出正中球杆历程的功用。,在添加头混合词换乘功能中换乘

由于不了解现在混合词的成功是故障的。,从此,应用预录制混合词T的第独身混合词,可以决定T是PRE的继任者。,这么,无论何时,它决定现在混合词和继位混合词的预先的警告。。

bintree 用于记载独身混合词,更确切地说,现在混合词的前体。,现在混合词的成功
bintree *inthreading(bintree *根) bintree *t = root; if(t){ inthreading(t->左子树/ /线索左子树
/****!!!!!****/
if(t->leftchild==空){/ /左子树是空的,线索。,让它要点它的初级粒子 t->lefttag = 1; t->leftchild = pre; }
//由于不了解现在混合词的成功是故障的。,从此,应用预录制混合词T的第独身混合词,可以决定T是PRE的继任者。,这么,无论何时,它决定现在混合词和继位混合词的预先的警告。
if(pre->rightchild==null){/ /前独身混合词的右子树是空的,线索。,使其要点它的继位 pre->righttag = 1; pre->rightchild = t; } pre = t;
/****!!!!!*****/ inthreading(t
->右子树/ /线索右子树 } return root; }

4。经过添加头混合词来球杆头混合词

前述的/***!!!!!****/    /****!!!!!****/行为准则的腰部面积是因此做的。:

    if(!即使右边的导游实地的是空的,则表现,由于它的预先的警告混合词好容易才被提问过,预分派,因而你可以给P-左翼分子分配,修正p >左)技术援助委 = 1(即规定为1)履行前体混合词的线索化。

跟起来比拟故障。。由于在这点上,P混合词的成功还没有使掉转船头。 有提问到,从此,要不是其前体混合词的右导游右子可以B,if(!右>右要旨即使为空,P是Pro的继任者。,这样 pre->rightchild = p,而且设置pre->righttag =1,履行继位混合词的线索化。

先行继位判决书履行后,不要遗忘现在硬块p分配给pre,下次应用。

    受胎线索二叉树后,对它举行遍历时,竟,它相当于伪造独身双向链表妥协。。

相似双向链表混合词,将独身添加到二叉树列表 个头硬块,列举如下图所示,并使其右边的实地的导游要点BI的根混合词,其rightchild域的导游要点中序遍历提问时的终于独身硬块(图中第 两步)。顽固地,让二叉树序数序列射中靶子第独身混合词,leftchild域导游和终于独身硬块的rightchild域导游均要点头硬块(图中第三和四步)。这些优点 是:咱们既可以从第独身硬块起顺继位举行遍历,也可以从终于独身混合词遍历前体。。

bintree *addheadthread(bintree *root,bintree *头)
    bintree *t = root;
    head->righttag=0;
    head->rightchild = head;
    if(t==空)
        head->lefttag = 0;
        head->leftchild = head;
    }else{
        pre = head;
        head->lefttag = 0;
        head->leftchild = 图中显示的T;/ /履行举步1
        inthreading(t);//在该历程中就先前履行了线索化和图中所示的举步3
        pre->rightchild = 头部;/ /履行举步4
        pre->righttag = 1;
        head->rightchild = 前/ /履行举步2
    }
}

5。线索二叉树的中央的遍历

void 二叉树 *头)
    bintree *t = head->右边的子混合词;/ /经过头混合词输入根混合词
    while(t!=头)//表现已遍历履行,导游t先前回到了头硬块
        while(t->lefttag==0环绕查找腰部遍历的第独身混合词
            t = t->leftchild;
        cout<data<<"";
        while(t->righttag==1&&t->rightchild!=头)//不休的输入继位,直到混合词RealSt娃不援用成功,即righttag!=1
            t = t->rightchild;
            cout<data<<"";
        }
        t = t->右子树;/ /输入右子树
    }
}

6。详尽的行为准则

/***********线索二叉树************
Author:ChengSong
语风:C
Time:2015/12/23
********************************/
#include
#include
#include<string>
#include
#include
#define type char
usingnamespace std;
class bintree
{
public:
    char data;
    bintree *leftchild,*rightchild;
    int lefttag,righttag;
};
bintree *pre;
bintree 查找(二叉树) *root,char in_data){
    bintree *t = root;
    bintree *node;
    if(t==NULL)return NULL;
    if(t->data == in_data)return t;
    else{
        node = 查找(t)leftchild,in_data);
        if(混合词) return node;
        elsereturn 查找(t)rightchild,in_data);
    }
}
bintree *createtree(){
    bintree *root = new bintree;
    bintree *parent;
    string in_string;
    while(cin>>in_string){
        if(in_string[2]-''0''==0){
            root->data = in_string[0];
            root->leftchild = root->rightchild = NULL;
            root->lefttag = root->righttag=0;
            continue;
        }
        parent = 查找(根),in_string[2]);
        if(in_string[4]-''0''==1){
            bintree *newnode = new bintree;
            newnode->data = in_string[0];
            newnode->leftchild = newnode->rightchild = NULL;
            newnode->lefttag = newnode->righttag=0;
            parent->leftchild = newnode;
        }elseif(in_string[4]-''0''==2){
            bintree *newnode = new bintree;
            newnode->data = in_string[0];
            newnode->leftchild = newnode->rightchild = NULL;
            newnode->lefttag = newnode->righttag = 0;
            parent->rightchild = newnode;
        }
        if(格查尔)''\n'')
            break;
    }
    return root;
}

bintree *inthreading(bintree *根)
    bintree *t = root;
    if(t){
        inthreading(t->leftchild);
        if(t->leftchild==空)
            t->lefttag = 1;
            t->leftchild = pre;
        }
        if(pre->rightchild==空)
            pre->righttag = 1;
            pre->rightchild = t;
        }
        pre = t;
        inthreading(t->rightchild);
    }
    return root;
}
bintree *addheadthread(bintree *root,bintree *头)
    bintree *t = root;
    head->righttag=0;
    head->rightchild = head;
    if(t==空)
        head->lefttag = 0;
        head->leftchild = head;
    }else{
        pre = head;
        head->lefttag = 0;
        head->leftchild = t;
        inthreading(t);
        pre->rightchild = head;
        pre->righttag = 1;
        head->rightchild = pre;
    }
}
void 二叉树 *头)
    bintree *t = head->leftchild;
    while(t!=头)
        while(t->lefttag==0)
            t = t->leftchild;
        cout<data<<"";
        while(t->righttag==1&&t->rightchild!=头)
            t = t->rightchild;
            cout<data<<"";
        }
        t = t->rightchild;
    }
}

int main(){
    bintree *root = createtree();
    bintree *head = new bintree;
    addheadthread(root,头)
    inorder(头)
    return0;
}

7。范本输入和输入

输入:

A(0),0) B(A),1) C(A),2) D(B,1) E(B,2) F(C,1) G(D,1) H(D,2)

NameE-mailWebsiteComment

发表评论

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