线索二叉树

线索二叉树即从前、中、后序三种遍历中其中一种来看,树中的左右孩子都不会是空着的,都会指向对应的前驱和后驱。
以中序遍历为例,二叉树线索化过程如下:
先是树的结构

typedef struct ThreadNode{
    Elemetype data;
    struct ThreadNode *lchild,*rchild;
    int ltag,rtag;
}ThreadNode,*ThreadTree;
void InThread(ThreadTree &p,ThreadTree &pre){//记录当前节点和前驱节点
    if(p!=NULL){
        InThread(p->lchild,pre);//先看左子树
        if(p->lchild==NULL){//对左孩子进行修改
            p->lchild=pre;
            p->ltag = 1;
        }
        if(pre!=NULL&&pre->rchild==NULL){//对右孩子进行修改
            pre->rchild=p;
            pre->rtag=1;
        }
        pre = p;//在下次搜索前及时修改前驱
        InThread(p->rchild,pre);//看右子树
    }
}

将树进行线索化

void CreateInThread(ThreadTree T){
    ThreadTree pre = NULL;
    if(T!=NULL){
        InThread(T,pre);
        pre->rchild = NULL;
        pre->rtag = 1;//对最后一个节点进行修改
    }
}

接下来是遍历线索树

ThreadNode *Firstnode(ThreadNode *p){
    while(p->ltag==0) p = p->lchild;
    return p;
}//找出左下第一个节点

ThreadNode *Nextnode(ThreadNode *p){
    if(p->rtag = 0) return Firstnode(p->rchild);
    else return p->rchild;
}//寻找下一个节点

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

void Inorder(ThreadNode *T){
    for(ThreadNode *p = Firstnode(T);p!=NULL;p = Nextnode(p))
        vist(p);
}
posted @ 2024-03-02 19:54  想成为编程高手的阿曼  阅读(16)  评论(0编辑  收藏  举报