回 帖 发 新 帖 刷新版面

主题:紧急求救!!!!二叉树线索化的C程序谁帮帮我啊

题目:构件一课二叉树,实现文件读入
   中序遍历二叉树
   中序线索化二叉树
   中序遍历线索二叉树
怎么办好哦!!?
星期一就要交了,
我怎么也写不出来
各位大哥
急救!!!!
急救!!!!

回复列表 (共3个回复)

沙发

同志们,
偶做出来了哦
不懂的同学可以参考![em2]
#include <iostream.h>
#include <stdlib.h>
#include<fstream.h>
#include<stdio.h>
#define link 0
#define thread 1
#define OVERFLOW 0
#define ok 1
#define error 0
fstream infile;
typedef struct Bitreenode
{
    int data;
    struct Bitreenode *lchild,*rchild;
    int ltag,rtag;                     //定义链式存储结构    
}Bitreenode,*Bitree;

Bitree pre;                     
int count=0;                //count为计数器,标记inthreading()的退出



void CreateBitree(Bitree &bt)     //先序构造二叉树
{
    int parent;
    if(infile>>parent&&parent!=EOF)        //读入文件且文件没有结束
    {
         if(parent==-2) bt=NULL;           //-2表示没有孩子
         else
         {
              if(!(bt=(Bitreenode *)malloc(sizeof(Bitreenode)))) exit(OVERFLOW);
              bt->data=parent;             //生成根结点
              bt->ltag=0;
              bt->rtag=0;
              cout<<parent<<' ';            //输出读入的数字
              CreateBitree(bt->lchild);              //构造左子树
              CreateBitree(bt->rchild);              //构造右子树
         }//else
    }
    //return bt;
}





void zxbl(Bitree bt) //中序遍历二叉树的递归算法
{
    if (bt) {
            zxbl(bt->lchild); // 访问左子树
            cout<<bt->data<<' ';  // 访问当前结点  
            zxbl(bt->rchild);  //访问右子树
    }
}

void zxblxsh(Bitree pt)     //中序遍历线索二叉树
{
    Bitreenode *qt;
    qt=pt->lchild;         //指向根结点
    while(qt!=pt)
    {                              //空树或遍历结束时,QT==PT
         while(qt->ltag==link) qt=qt->lchild;
         cout<<qt->data<<' ';   //访问其左子树为空的结点
         while(qt->rtag==thread&&qt->rchild!=pt)
         {
             qt=qt->rchild;
             cout<<qt->data<<' ';
         }        //访问后继结点
         qt=qt->rchild;
    }

}

void Inthreading(Bitree qt,const Bitree pt)
{   
    if(qt)
    {
        if(pre==pt&&count!=0)
            return;
        Inthreading(qt->lchild,pt);           //左子树线索化
        if(!qt->lchild)
        {
            qt->ltag=thread;
            qt->lchild=pre;
        }       //前驱线索
        if(!pre->rchild)
        {
            pre->rtag=thread;
            pre->rchild=qt;
        }     //后继线索
        pre=qt;                            //保持PRE指向P的前驱
        Inthreading(qt->rchild,pt);
        count++;
    }          //右子树线索化
}

Bitree xsh(Bitree bt,Bitree &pt)              //线索化二叉树
{   if(!(pt=(Bitree)malloc(sizeof(Bitreenode))))
         exit(OVERFLOW);
    pt->ltag=link;                               //建立头结点
    pt->rtag=thread;                             
    pt->rchild=pt;                            //右指针回指
    if(!bt)
        pt->lchild=pt;
    else
    {
         pt->lchild=bt;
         pre=pt;
         Inthreading(pt,pt);                    //中序遍历进行中序线索化
         pre->rchild=pt;
         pre->rtag=thread;    //最后一个结点线索化
         pt->rchild=pre;
    }
    return pt;
}


void main()
{   Bitree bt,pt;
    infile.open("data1.txt",ios::in);
    if(!infile){
          cout<<"data1.txt can't open."<<endl;
          abort();}//if
    cout<<"先序构造二叉树:"<<endl;
    CreateBitree(bt);
    cout<<endl;
    cout<<"中序遍历二叉树:"<<endl;
    zxbl(bt);
    cout<<endl;
    cout<<"线索化后中序遍历二叉树:"<<endl;
    xsh(bt,pt);            //in threading
    zxblxsh(pt);           //中须遍历线索化
    cout<<endl;
}//main

板凳

我还是觉得好难学啊
数据结构<-------想说爱你并不是意见很容易的事
[em2]

3 楼

d

我来回复

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