2019-04-29 线索化二叉树整理

定义一下结构体,下面的算法可能和定义有点不一样,但是差不多
eg.这里的"最左下"结点不一定是叶子结点,呃呃呃,没错,最右下也是如此

typedef struct ThreadNode{
    ElemType data;
    struct ThreadNode *lchild,*rchild;
    int ltag,rtag; 
}ThreadNode,*ThreadTree; 
/*先序线索二叉树找前驱*/
1.如果要在先序线索二叉树中找一个结点的前驱结点,那么必须找到它的“双亲节点”
2.我们这里假设通过一个函数找到了结点p的双亲节点f (一定要找到双亲节点)

主要思想:
1.如果p是p的双亲节点f的左孩子,那么x的前驱为f
2.如果p是p的双亲节点f的右孩子,那么x的前驱为f的左子树的“最右下叶节点”

BiThrTree PrePre(BiThrThee p)
{
    if(p->Ltag == 1)
        pre = p->LChild;   
    else{
        f = findfather(p); //我们假设写好了这样的一个函数 
        if( f->LChild == p ) pre=f;
        else{
        
            //for(q=f->LChild;q->Rtag==0;q=q->RChild)       
            //pre = q;         
             pre=p的双亲的右子树的最左下叶结点;
        }  
    }
    return pre;
}
/*先序线索二叉树找后继*/
1.如果有线索,使用线索
2.如果没有线索并且左子树不为空树,后继结点是左子树的根结点
3.如果没有线索并且右子树不为空树,后继结点是右子树的根结点

BiThrTree PreNext(BiThrThee p)
{
    if(p->Rtag == 1)
        next = p->RChild;
    else if(p->LChild){
        next = p->LChild;
    }else{
        next = p->RChild;
    }
    return next;
}
/*中序线索二叉树找前驱*/
  1.如果该结点有指向前驱的线索,那么直接使用线索访问
  2.如果没有线索,那么说明Ltag==0,即该结点有左子树,那么
    前驱结点是他的左子树的最右下结点

BiThrTree InPre(BiThrThee p)
{
    if(p->Ltag == 1)
        pre = p->LChild;
    else{
        for(q=p->LChild;q->Rtag==0;q=q->RChild)
            pre = q;
    }
    return pre;
}
/*中序线索二叉树找后继*/
  1.如果该结点有指向后继的线索,那么直接使用线索访问
  2.如果没有线索,那么说明Rtag==0,即该结点有右子树,那么
    前驱结点是他的右子树的最左下结点

BiThrTree InNext(BiThrThee p)
{
    if(p->Rtag == 1)
        pre = p->RChild;
    else{
        for(q=p->RChild;q->Ltag==0;q=q->LChild)
            pre = q;
    }
    return pre;
}
/*后序线索二叉树找前驱*/
思路:
1.如果有线索指向前驱,那么使用线索找到前驱
2.如果没有线索,说明左子树不为空(右子树是否为空不清楚,分开讨论一下)
3.后续遍历,根是在遍历完了左右子树之后才可以遍历的,
因此p的前驱一定是两个子树最后遍历结点。
4.如果p的右子树非空,p->RChild一定是前驱
5.如果p的右子树为空,p->LChild一定是前驱 

BiThrTree PostPre(BiThrThee p)
{
    if(p->Ltag == 1)
        pre = p->LChild;
    else{
        if(p->RChild) pre=p->RChild;
        else pre=p->LChild; 
    }
    return pre;
}
/*后序线索二叉树找后继*/
思路:(需要找到双亲结点!!!) 
1.若p是根节点,那么它没有后继结点
2.若p有指向后继的线索,使用线索进行访问后继结点 
3.若p是其双亲的右孩子,那么双亲结点f就是p后继结点
4.若p是其双亲的左孩子 
    4.1若p没有右兄弟节点,p的后继结点为f
    4.2若p有右兄弟结点,p的后继结点是p的双亲的右子树
       中第一个后序遍历到的结点,它是该子树的“最左下叶结点” 

BiThrTree PostNext(BiThrThee p)
{
    if(p->Rtag == 1)
        pre = p->RChild;
    else{
        f=findFather(p); //找到父节点 
        if( f->RChild==p ) pre=f;
        else if( f->LChild==p ){
            if( f->RChild==NULL ) pre=f;
            else pre= p的双亲的右子树的最左下叶结点; 
        } 
    }
    return pre;
}
这是网上找的中序线索化其他的写法:(只是把for改成了while)
BinThrNode *InorderSuccessor(BinThrNode *p)
{
    //在中序线索树查找*p的后继
    BinThrNode *q;
    if(p->rtag==Thread)
        return p->rchlid;//返回其所指的后继
    else
    {
        q = p->rchild;//从*p的右孩子开始查找
        while(q->ltag==Link)
            q = q->lchild;//左子树为空,沿左链往下查找
        return q;
    }
}
BinThrNode *Inorderpre(BinThrNode *p)
{//在中序线索树中找结点*p的中序前趋,设p非空
    BinThrNode *q;
    if (p->ltag==Thread) //*p的左子树为空
        return p->lchild; //返回左线索所指的中序前趋
    else{
        q=p->lchild; //从*p的左孩子开始查找
        while (q->rtag==Link)
            q=q->rchild; //右子树为空时,沿右链往下查找
            return q; //当q的右子树为空时,它就是最右下结点
        } //end if
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,548评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,497评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,990评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,618评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,618评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,246评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,819评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,725评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,268评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,356评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,488评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,181评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,862评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,331评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,445评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,897评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,500评论 2 359

推荐阅读更多精彩内容