ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

线索二叉树之「后序线索二叉树」(三叉链表实现遍历)

2020-03-15 18:37:03  阅读:317  来源: 互联网

标签:lchild 结点 ThreadNode 链表 pnode 二叉树 rchild NULL 线索


typedef struct ThreadNode{
    int data;
    struct ThreadNode *lchild,*rchild,*pnode;
    int ltag,rtag;
}ThreadNode,*ThreadTree;

ThreadNode *pre=NULL;

//初始化一棵树
void initTree(ThreadTree &T){
    T = (ThreadNode *)malloc(sizeof(ThreadNode));
    ThreadNode *n2 =(ThreadNode *)malloc(sizeof(ThreadNode));
    ThreadNode *n3 =(ThreadNode *)malloc(sizeof(ThreadNode));
    ThreadNode *n4 =(ThreadNode *)malloc(sizeof(ThreadNode));
    ThreadNode *n5 =(ThreadNode *)malloc(sizeof(ThreadNode));
    
    T->data=1;
    T->ltag=T->rtag=0;

    n2->data=2;
    n2->ltag=n2->rtag=0;
    n2->lchild=NULL;
    n2->rchild=NULL;
    T->lchild=n2;
    n2->pnode=T;
    
    n3->data=3;
    n3->ltag=n3->rtag=0;
    n3->lchild=NULL;
    n3->rchild=NULL;
    T->rchild=n3;
    n3->pnode=T;
    
    n4->data=4;
    n4->ltag=n4->rtag=0;
    n4->lchild=NULL;
    n4->rchild=NULL;
    n2->lchild=n4;
    n4->pnode=n2;
    
    n5->data=5;
    n5->ltag=n5->rtag=0;
    n5->lchild=NULL;
    n5->rchild=NULL;
    n3->lchild=n5;
    n5->pnode=n3;
}
//线索化后序二叉树
void visit(ThreadNode *q){
    if (q->lchild==NULL) {
        q->lchild=pre;
        q->ltag=1;
    }
    if (pre!=NULL&&pre->rchild==NULL) {
        pre->rchild=q;
        pre->rtag=1;
    }
    pre=q;
}

void PostThread(ThreadTree T){
    if (T!=NULL) {
        if (T->ltag==0) {
            PostThread(T->lchild);
        }
        if (T->rtag==0) {
            PostThread(T->rchild);
        }
        visit(T);
    }
}

//后序线索化二叉树T
void CreatePostThread(ThreadTree T){
    if (T!=NULL) {
        PostThread(T);
        if (pre->rchild==NULL) {
            pre->rtag=1;
        }
    }
}

void printing(ThreadNode *q){
    printf("%d",q->data);
}

ThreadNode *FirstNode(ThreadNode *T){
    ThreadNode *q=T;
    while (q->ltag==0) {
        q=q->lchild;
    }
    if (q->rtag==0) {
        q=q->rchild;
    }
    return q;
}

ThreadNode *NextNode(ThreadNode *q){
    if (q->rtag==1) {
        return q->rchild;
    }
    if (q->pnode!=NULL) {
        //当前结点是父结点的右孩子,那么后继结点为双亲结点
        if (q->pnode->rchild==q) {
            return q->pnode;
        }
        //当前结点是父结点的左孩子,并且「没有」兄弟结点,那么后继结点为双亲结点
        if (q->pnode->lchild==q&&q->pnode->rtag==1) {
            return q->pnode;
        }
        //当前结点是父结点的左孩子,并且「有」兄弟结点,那么后继结点为父节点的右子树中后序遍历的第一个结点
        if (q->pnode->lchild==q&&q->pnode->rtag==0) {
            return FirstNode(q->pnode->rchild);
        }
    }
    return NULL;
}

//后序遍历
void PostOrder(ThreadNode *T){
    //利用三叉链表实现遍历
    for(ThreadNode *p=FirstNode(T);p!=NULL;p=NextNode(p)){
        printf("%d",p->data);
    }
}

标签:lchild,结点,ThreadNode,链表,pnode,二叉树,rchild,NULL,线索
来源: https://blog.csdn.net/ooobama/article/details/104883359

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有