首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

数据结构之二叉树的兑现

2012-12-25 
数据结构之二叉树的实现1、二叉树的基本运算?? ??#define MaxSize 100typedef char ElemTypetypedef struc

数据结构之二叉树的实现

1、二叉树的基本运算

?? ??#define MaxSize 100

typedef char ElemType;typedef struct node{    ElemType data;    struct node *lchild;    struct node *rchild;}BTNode;void CreateBTNode(BTNode *&b,char *str){    BTNode *St[MaxSize],*p=NULL;    int top=-1,k,j=0;    char ch;    b=NULL;    ch=str[j];    while(ch!='\0'){        switch (ch) {            case '(':top++,St[top]=p;k=1;break;            case ')':top--;break;            case ',': k=2;break;            default:p=(BTNode *)malloc(sizeof(BTNode));                p->data=ch;p->lchild=p->rchild=NULL;                if(b==NULL){                    b=p;                }else{                    switch (k) {                        case 1:St[top]->lchild=p;break;                        case 2:St[top]->rchild=p;break;                        }                                }        }                j++;        ch=str[j];    }}BTNode *FindNode(BTNode *b,ElemType x){    BTNode *p;    if(b==NULL){        return NULL;    }    else if(b->data==x){        return b;    }else{        p=FindNode(b->lchild, x);        if(p!=NULL){            return p;        }else{            return FindNode(b->rchild, x);        }    }}BTNode *LchildNode(BTNode *p){    return p->lchild;}BTNode *RchildNode(BTNode *p){    return p->rchild;}int BTNodeDepth(BTNode *b){    int lchilddep,rchilddep;    if(b==NULL){        return 0;    }else{        lchilddep=BTNodeDepth(b->lchild);        rchilddep=BTNodeDepth(b->rchild);        return lchilddep>rchilddep?lchilddep+1:rchilddep+1;    }}void DispBTNode(BTNode *b){    if(b!=NULL){        printf("%c ",b->data);        if(b->lchild!=NULL||b->rchild!=NULL){            printf("(");            DispBTNode(b->lchild);            if(b->rchild!=NULL){                printf(",");                DispBTNode(b->rchild);            }            printf(")");        }        }     }int BTWidth(BTNode *b){    struct{        int lno;        BTNode *p;    }Qu[MaxSize];    int front,rear;    int lnum,max,i,n;    front=rear=0;    if(b!=NULL){        rear++;        Qu[rear].p=b;        Qu[rear].lno=1;        while(rear!=front){            front++;            b=Qu[front].p;            lnum=Qu[front].lno;            if(b->lchild!=NULL){                rear++;                Qu[rear].p=b->lchild;                Qu[rear].lno=lnum+1;            }            if(b->rchild!=NULL){                rear++;                Qu[rear].p=b->rchild;                Qu[rear].lno=lnum+1;            }        }                max=0;lnum=1;i=1;        while(i<=rear){            n=0;            while(i<=rear&&Qu[i].lno==lnum){                n++;                i++;            }            lnum=Qu[i].lno;            if(n>max){                max=n;            }        }                return max;        }else{        return 0;    }    }int Nodes(BTNode *b){    if(b==NULL){        return 0;    }else if(b->lchild==NULL&&b->rchild==NULL){        return 1;    }else{            return Nodes(b->lchild)+Nodes(b->rchild)+1;    }}int LeafNodes(BTNode *b){    if(b==NULL){        return 0;    }else if(b->lchild==NULL&&b->rchild==NULL){        return 1;    }else{        return LeafNodes(b->lchild)+LeafNodes(b->rchild);    }}

?2、二叉树的遍历

?? ? ? 2.1递归遍历

?

void PreOrder(BTNode *b){    if(b!=NULL){        printf("%c",b->data);        PreOrder(b->lchild);        PreOrder(b->rchild);    }}void InOrder(BTNode *b){    if(b!=NULL){        InOrder(b->lchild);        printf("%c",b->data);        InOrder(b->rchild);    }}void PostOrder(BTNode *b){    if(b!=NULL){        PostOrder(b->lchild);        PostOrder(b->rchild);        printf("%c",b->data);    }}

?

?? 2.2非递归遍历

?

?

void ProOrder1(BTNode *b){    BTNode *p;    struct  {        BTNode *pt;        int tag;    }St[MaxSize];        int top=-1;    top++;    St[top].pt=b;    St[top].tag=1;    while(top>-1){        if(St[top].tag==1){            p=St[top].pt;            top--;            if(p!=NULL){                top++;                St[top].pt=p->rchild;                St[top].tag=1;                                top++;                St[top].pt=p->lchild;                St[top].tag=1;                top++;                St[top].pt=p;                St[top].tag=0;                        }        }        if(St[top].tag==0){            printf("%c",St[top].pt->data);            top--;        }    }}void InOrder1(BTNode *b){    BTNode *p;    struct  {        BTNode *pt;        int tag;    }St[MaxSize];        int top=-1;    top++;    St[top].pt=b;    St[top].tag=1;    while(top>-1){        if(St[top].tag==1){            p=St[top].pt;            top--;            if(p!=NULL){                top++;                St[top].pt=p->rchild;                St[top].tag=1;                                top++;                St[top].pt=p;                St[top].tag=0;                                top++;                St[top].pt=p->lchild;                St[top].tag=1;                            }        }        if(St[top].tag==0){            printf("%c",St[top].pt->data);            top--;        }    }}void PostOrder1(BTNode *b){    BTNode *p;    struct  {        BTNode *pt;        int tag;    }St[MaxSize];        int top=-1;    top++;    St[top].pt=b;    St[top].tag=1;    while(top>-1){        if(St[top].tag==1){            p=St[top].pt;            top--;            if(p!=NULL){                               top++;                St[top].pt=p;                St[top].tag=0;                                top++;                St[top].pt=p->rchild;                St[top].tag=1;                                top++;                St[top].pt=p->lchild;                St[top].tag=1;                            }        }        if(St[top].tag==0){            printf("%c",St[top].pt->data);            top--;        }    }    }

?3、从叶子节点到根结点的路径

??

?

void AllPath(BTNode *b){    struct snode {        BTNode *node;        int parent;    }Qu[MaxSize];    int front,rear,p;    front=rear=-1;    rear++;    Qu[rear].node=b;    Qu[rear].parent=-1;    while(front<rear){        front++;        b=Qu[front].node;        if(b->lchild==NULL&&b->rchild==NULL){            printf("%c到根结点的路径: ",b->data);            p=front;            while(Qu[p].parent!=-1){                printf("  %c",Qu[p].node->data);                p=Qu[p].parent;            }            printf("  %c\n",Qu[p].node->data);        }        if(b->lchild!=NULL){            rear++;            Qu[rear].node=b->lchild;            Qu[rear].parent=front;        }        if(b->rchild!=NULL){            rear++;            Qu[rear].node=b->rchild;            Qu[rear].parent=front;        }        }}void AllPath1(BTNode *b,ElemType path[],int pathlen){    int i;    if(b!=NULL){        if(b->lchild==NULL&&b->rchild==NULL){            printf(" %c到根接的路径: %c",b->data,b->data);            for(i=pathlen-1;i>=0;i--){                printf("   %c",path[i]);            }            printf("\n");        }else{            path[pathlen]=b->data;            pathlen++;            AllPath1(b->lchild, path, pathlen);            AllPath1(b->rchild, path, pathlen);            pathlen--;        }        }}void LongPath(BTNode *b,ElemType path[],int pathlen,ElemType longpath[],int &longpathlen){    int i;    if(b==NULL){        if(pathlen>longpathlen){            for (i=pathlen-1; i>=0; i--) {                longpath[i]=path[i];            }            longpathlen=pathlen;        }    }else{        path[pathlen]=b->data;        pathlen++;        LongPath(b->lchild, path, pathlen, longpath, longpathlen);        LongPath(b->rchild, path, pathlen, longpath, longpathlen);        pathlen--;        }    }void DispLeaf(BTNode *b){    if(b!=NULL){        if(b->lchild==NULL&&b->rchild==NULL){            printf("%c ",b->data);        }else{            DispLeaf(b->lchild);            DispLeaf(b->rchild);        }    }    }
?

热点排行