回 帖 发 新 帖 刷新版面

主题:[讨论]这个二叉树怎么调不通,调了几天了,也知道错误在什么地方!

请看主函数部分:错误地方我会指出

#include<iostream.h>
#include<malloc.h>
#define MaxSize 40
typedef char Elemtype;
typedef struct node
{
    Elemtype data;//数据
    int lflag,rflag;
    struct node *left,*right;//左右指针
} BTree;
void creatree(BTree *&b,char *str)//由广义表样式创建线索二叉树
{
    BTree *stack[MaxSize],*p;
    int top=-1,j=0;//栈空
    int k;//左右指标志
    char ch;
    b=NULL;
    ch=str[j];
    while(ch!='\0')
    {
        switch(ch)
        {
        case '(': top++;stack[top]=p;k=1;break;
        case ')': top--;break;
        case ',': k=2;break;
        default: p=(BTree*)malloc(sizeof(BTree));
                 p->data=ch;p->left=p->right=NULL;p->lflag=p->rflag=0;
                 if(b==NULL)
                     b=p;//根结点
                 else
                 {
                     if(k==1) stack[top]->left=p;
                     if(k==2) stack[top]->right=p;
                 }
        }
        j++;ch=str[j];
    }
}
void printree(BTree *b)//由广义表形式输出二叉树
{
    if(b!=NULL)
    {
        cout<<b->data;
        if(b->left!=NULL||b->right!=NULL)
        {
            cout<<"(";
        printree(b->left);
        if(b->right!=NULL)
            cout<<",";
        printree(b->right);
        cout<<")";
        }
    }
}
void thread(BTree *r,BTree *pre)//把二叉树线索化
{
    if(r!=NULL) 
    {
        thread(r->left,pre);
        if(r->left==NULL)//指向前驱结点
        {
            
            r->left=pre;r->lflag=1;
        }
        if(pre!=NULL&&pre->right==NULL)//指向后继结点
        {
            
            pre->right=r;pre->rflag=1;
        }
        pre=r;
        thread(r->right,pre);

    }

}
BTree* creatthread(BTree *b)//加上头结点,生成线索二叉树
{
    BTree *pre;
    BTree *root,*p;
    root=(BTree*)malloc(sizeof(BTree));//建立头结点
    root->lflag=0;root->rflag=1;//
    if(b==NULL)
    {
        root->left=root;
        root->right=root;
    }
    else
    {
        p=root->left=b;//curr=(原root)
        root->lflag=0;
        pre=root;//pre=头root
        thread(p,pre);
        pre->right=root;//处理最后结点
        pre->rflag=1;
        root->right=pre;//把头结点右指针指向最后一个结点
        root->rflag=1;
    }
    return root;
}
BTree *first(BTree *root)//求第一个结点
{
    while(root->lflag==0)
        root=root->left;
    return root;
}
BTree *last(BTree *root)//求最后一结点
{
    BTree *p=root->right;
    return p;
}
BTree *next(BTree *root,BTree *q)//求q的后继结点
{
    BTree *p=q->right,*n;//怎么p 为空呀!靠
    if(q->rflag==0)
        while(p->lflag==0)
            p=p->left;
        n=p;
        if(n==root)
            return NULL;
        else
            return n;
}
BTree *prior(BTree *root,BTree *q)//求q的前驱结点
{
    BTree *p=q->left,*n;
    if(q->lflag==0)
        while(p->rflag==0)
            p=p->right;
        n=p;
        if(n==root)
            return NULL;
        else
            return n;
}
void forward(BTree *root)
{
    BTree *p;
    for(p=first(root);p!=NULL;p=next(root,p))
        cout<<p->data<<" ";
    cout<<endl;
}
void back(BTree *root)
{
    BTree *p;
    for(p=last(root);p!=NULL;
                            p=prior(root,p))
        cout<<p->data<<" ";
    cout<<endl;
}
void main()
{
    BTree *b,*root;
    creatree(b,"(a(b(d),c))");
    cout<<"广义表输出二叉树: ";printree(b);
    cout<<endl;
    root=creatthread(b);
    cout<<"中序正向遍历: ";
    forward(root);             //这个地方,里面的next()函中,第一次循环
                                //p==NULL,为什么会是空,本来应是下一个结点的    cout<<"中序反向遍历: ";
    back(root);
}

回复列表 (共1个回复)

沙发


你要知道二叉树怎么工作的!
知道2i
2i+1
先根:i,2i,2i+1 
中根:2i,i,2i+1
后根:2i,2i+1,i
i 2I 2I+1
........

我来回复

您尚未登录,请登录后再回复。点此登录或注册