穿线二叉树

来源:互联网 发布:iphoto 7 for mac 编辑:程序博客网 时间:2024/06/02 10:08
#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef char type;typedef struct node{    type data;    int ltag,rtag;    struct node *lchild,*rchild;}binthrnode;typedef binthrnode *binthrtree;binthrtree pre=NULL;//前序遍历创建一棵二叉树binthrtree createbintree(){    char ch;    binthrtree t;    if((ch=getchar())=='#')        t=NULL;    else    {        t=(binthrnode*)malloc(sizeof(binthrnode));        t->data=ch;        t->lchild=createbintree();        t->rchild=createbintree();    }    return t;}//将普通二叉树进行中序线索化void inthreading(binthrtree *p){    if(*p)    {        inthreading(&(*p)->lchild);//中序线索化左子树        (*p)->ltag=((*p)->lchild)?0:1;//根据左子树调整左标记        (*p)->rtag=((*p)->rchild)?0:1;//根据右子树调整右标记        if(pre)//如果存在前驱        {            if(pre->rtag==1)pre->rchild=*p;            //如果前驱的右子树不存在,则将其右指针连接到当前树            if((*p)->ltag==1)(*p)->lchild=pre;            //如果当前树的左子树不存在,则将当前树的左指针指向前驱        }        pre=*p;//更新前驱        inthreading(&(*p)->rchild);//中序线索化右子树    }}//创建中序穿线二叉树void createthrtree(binthrtree *p){    *p=createbintree();    inthreading(p);}//求中序遍历线索二叉树中节点p的后继节点binthrtree insuccnode(binthrtree p){    binthrtree q;    if(p->rtag==1)//如果正好存在后继位置,则返回后继        return p->rchild;    else    {        q=p->rchild;//按照中序遍历顺序,当前节点的后继应该为                    //其右子树的最左下的节点        while(q->ltag==0)            q=q->lchild;        return q;    }}void inthrtree(binthrtree p){    if(p)    {        while(p->ltag==0)//找到中序遍历下第一个节点                        //即:最左下位置            p=p->lchild;        do        {            printf("%d\n",p->data);            p=insuccnode(p);//循环它的后继节点        }        while(p);    }}

0 0