标题:初学二叉树 求助 一直显示函数未定义 可是我根本不会定义啊
只看楼主
遗情处有诗章
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2017-3-10
结帖率:75%
 问题点数:0 回复次数:21 
初学二叉树 求助 一直显示函数未定义 可是我根本不会定义啊
#include<stdio.h>
#include <stdlib.h>
#include<iostream>
#define MAXSIZE  1024
#define MAXNODE  1024
using namespace std;
typedef struct BiTNode
{
  char  data;
  struct BiTNode *lchild,*rchild;    /*左右孩子指针*/
}BiTNode,*BiTree;

 int Initiate (BiTree bt)
    {/*初始化建立二叉树*bt的头结点*/
         if((bt=(BiTNode*)malloc(sizeof(BiTNode)))==NULL)
                return 0;
         bt->lchild=NULL;
         bt->rchild=NULL;
         return 1;
}
 
void PreOrder(BiTree bt)
{  /*先序遍历二叉树bt*/
  if (bt==NULL) return;     /*递归调用的结束条件*/
Visite(bt->data);       /*访问结点的数据域*/
  PreOrder(bt->lchild);   /*先序递归遍历bt的左子树*/
  PreOrder(bt->rchild);   /*先序递归遍历bt的右子树*/  
}
void InOrder(BiTree bt)
{  /*中序遍历二叉树bt*/
  if (bt==NULL) return;     /*递归调用的结束条件*/
  Visite(bt->data);       /*访问结点的数据域*/
  PreOrder(bt->lchild);   /*先序递归遍历bt的左子树*/
  PreOrder(bt->rchild);   /*先序递归遍历bt的右子树*/  
}
void PostOrder(BiTree bt)
{  /*后序遍历二叉树bt*/
    if (bt==NULL) return;     /*递归调用的结束条件*/
    PostOrder(bt->lchild);   /*后序递归遍历bt的左子树*/
    PostOrder(bt->rchild);   /*后序递归遍历bt的右子树*/  
    Visite(bt->data);       /*访问结点的数据域*/
}
void LevelOrder(BiTree bt,int q)
    /*层次遍历二叉树bt*/
{ Queue :q=Init_Queue();
    int front,rear;
     if (bt==NULL) return;
        In_Queue(q,bt);
          BiTree x;
      while(!Empty_Queue(q))
         {OutQueue(q,&x);
          Visite(x->data);    /*访问队首结点的数据域*/
          if (x->lchild!=NULL)   /*将队首结点的左孩子结点入队列*/
           {
                  In_Queue(q, x->lchild);
            }
          if (x->rchild!=NULL)   /*将队首结点的右孩子结点入队列*/
           {
    In_Queue(q, x->rchild);
            }
         }
         Destroy_Queue(&q);
}
void NRPreOrder(BiTree bt)
{/*非递归先序遍历二叉树*/
    BiTree stack[MAXSIZE],p;
    int top;
    if(bt==NULL)return;
    top=0;
    p=bt;
    while(!(p=NULL&&top==0))
    {
        while(p!=NULL)
        {
                  /*访问节点的数据域*/
            if(top<MAXNODE-1)     /*将当前指针p压栈*/
            {
                stack[top]=p;
                top++;
            }
        else{
            printf("栈溢出");
            return;
        }
        p=p->lchild;             /*指针指向p的左孩子*/
        }
        if(top<=0)return;       /*栈空时结束*/
        else{
            top--;
            p=stack[top];       /*从栈中弹出栈顶元素*/
             Visite(p->data);     
            p=p->rchild;       /*指针指向p的右孩子节点*/
        }
    }
}
void Destroy (BiTree *bt)
   {
          if(*bt)
           {
                  Destroy(&(*bt)->lchild);
                  Destroy(&(*bt)->rchild);
                  free(*bt);
             }
             *bt=NULL;
}
int main()
{
   
}
搜索更多相关主题的帖子: include return 二叉树 左右 
2017-03-25 00:57
遗情处有诗章
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2017-3-10
得分:0 
求助 求助
#include<stdio.h>
#include <stdlib.h>
#include<iostream>
#define MAXSIZE  1024
#define MAXNODE  1024
using namespace std;
typedef struct BiTNode
{
  char  data;
  struct BiTNode *lchild,*rchild;    /*左右孩子指针*/
}BiTNode,*BiTree;

 int Initiate (BiTree bt)
    {/*初始化建立二叉树*bt的头结点*/
         if((bt=(BiTNode*)malloc(sizeof(BiTNode)))==NULL)
                return 0;
         bt->lchild=NULL;
         bt->rchild=NULL;
         return 1;
}
 
void PreOrder(BiTree bt)
{  /*先序遍历二叉树bt*/
  if (bt==NULL) return;     /*递归调用的结束条件*/
Visite(bt->data);       /*访问结点的数据域*/
  PreOrder(bt->lchild);   /*先序递归遍历bt的左子树*/
  PreOrder(bt->rchild);   /*先序递归遍历bt的右子树*/  
}
void InOrder(BiTree bt)
{  /*中序遍历二叉树bt*/
  if (bt==NULL) return;     /*递归调用的结束条件*/
         /*访问结点的数据域*/
  PreOrder(bt->lchild);/*先序递归遍历bt的左子树*/
   Visite(bt->data);  
  PreOrder(bt->rchild);   /*先序递归遍历bt的右子树*/  
}
void PostOrder(BiTree bt)
{  /*后序遍历二叉树bt*/
    if (bt==NULL) return;     /*递归调用的结束条件*/
    PostOrder(bt->lchild);   /*后序递归遍历bt的左子树*/
    PostOrder(bt->rchild);   /*后序递归遍历bt的右子树*/  
    Visite(bt->data);       /*访问结点的数据域*/
}
void LevelOrder(BiTree bt,int q)
    /*层次遍历二叉树bt*/
{ Queue :q=Init_Queue();
    int front,rear;
     if (bt==NULL) return;
        In_Queue(q,bt);
          BiTree x;
      while(!Empty_Queue(q))
         {OutQueue(q,&x);
          Visite(x->data);    /*访问队首结点的数据域*/
          if (x->lchild!=NULL)   /*将队首结点的左孩子结点入队列*/
           {
                  In_Queue(q, x->lchild);
            }
          if (x->rchild!=NULL)   /*将队首结点的右孩子结点入队列*/
           {
    In_Queue(q, x->rchild);
            }
         }
         Destroy_Queue(&q);
}
void NRPreOrder(BiTree bt)
{/*非递归先序遍历二叉树*/
    BiTree stack[MAXSIZE],p;
    int top;
    if(bt==NULL)return;
    top=0;
    p=bt;
    while(!(p=NULL&&top==0))
    {
        while(p!=NULL)
        {
                  /*访问节点的数据域*/
            if(top<MAXNODE-1)     /*将当前指针p压栈*/
            {
                stack[top]=p;
                top++;
            }
        else{
            printf("栈溢出");
            return;
        }
        p=p->lchild;             /*指针指向p的左孩子*/
        }
        if(top<=0)return;       /*栈空时结束*/
        else{
            top--;
            p=stack[top];       /*从栈中弹出栈顶元素*/
             Visite(p->data);     
            p=p->rchild;       /*指针指向p的右孩子节点*/
        }
    }
}
void Destroy (BiTree *bt)
   {
          if(*bt)
           {
                  Destroy(&(*bt)->lchild);
                  Destroy(&(*bt)->rchild);
                  free(*bt);
             }
             *bt=NULL;
}
int main()
{
   
}
以上是我修过的 错误均是函数未定义到底该怎么定义啊
2017-03-25 11:48
遗情处有诗章
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2017-3-10
得分:0 
2017-03-25 12:18
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
楼主原来代码不齐全~
还差个输入函数~这个自己添加输入数据~~~
上网查过一下非递归的后序遍历二叉树~感觉那个上难度~难怪没有要求后序遍历用非递归实现~~~

程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE  1024
#define MAXNODE  1024

typedef struct QueueNode
{
    char s[MAXSIZE];    /*队列存放数据*/
    int front;          /*队列头指针*/
    int rear;           /*队列尾指针*/

}QueueNode,*Queue;



typedef struct BiTNode
{
  char  data;
  struct BiTNode *lchild,*rchild;    /*左右孩子指针*/
}BiTNode,*BiTree;

Queue Init_Queue();                 /*队列初始化*/
void In_Queue(Queue q,BiTree bt);   /*入队*/
void OutQueue(Queue q,BiTree* x);   /*出队并取其数据*/
void Destroy_Queue(Queue* q);       /*销毁队列*/

int Empty_Queue(Queue q);           /*判断队列是否为空*/
int Full_Queue(Queue q);            /*判断队列是否为满*/


int Initiate (BiTree bt);           /*初始化二叉树*/
void PreOrder(BiTree bt);           /*前序遍历*/
void InOrder(BiTree bt);            /*中序遍历*/
void PostOrder(BiTree bt);          /*后序遍历*/
void LevelOrder(BiTree bt);         /*层次遍历*/
void NRPreOrder(BiTree bt);         /*非递归前序遍历*/
void Destroy (BiTree* bt);          /*销毁二叉树*/

void Visite(char c)
{
    printf("%c",c);
}


int main()  /*主函数*/
{
    
}

Queue Init_Queue()
{
    Queue p=(Queue)malloc(sizeof (QueueNode));

    if (p==NULL)
    {
        puts("申请空间失败!");
        return NULL;
    }

    memset(p->s,0,sizeof(p->s));

    p->front=p->rear=0;

    return p;
}

void In_Queue(Queue q,BiTree bt)   /*入队*/
{
    if (Full_Queue(q))
        return ;

    ++q->rear;
    q->rear%=MAXSIZE;
    bt->data=q->s[q->rear];
}

void OutQueue(Queue q,BiTree* bt)       /*出队*/
{
    if (Empty_Queue(q))
        return ;

    ++q->front;
    q->front%=MAXSIZE;
    (*bt)->data=q->s[q->front];

}

int Empty_Queue(Queue q)         /*判断队列是否为空*/
{
    return q->front==q->rear;
}

void Destroy_Queue(Queue* q)       /*销毁队列*/
{
    if (*q)
        free(*q);

    *q=NULL;
}

int Full_Queue(Queue q)
{
    return q->front==q->rear+1;  /*判断是否队满*/
}

int Initiate (BiTree bt)   /*初始化建立二叉树*bt的头结点*/
{
     if((bt=(BiTNode*)malloc(sizeof(BiTNode)))==NULL) 
            return 0;

     bt->lchild=NULL;
     bt->rchild=NULL;
     return 1;
}

 
void PreOrder(BiTree bt)       /*先序遍历二叉树bt*/
{  
  if (bt==NULL)
      return;                  /*递归调用的结束条件*/

  Visite(bt->data);           /*访问结点的数据域*/

  PreOrder(bt->lchild);       /*先序递归遍历bt的左子树*/
  PreOrder(bt->rchild);       /*先序递归遍历bt的右子树*/  
}
void InOrder(BiTree bt)       /*中序遍历二叉树bt*/
{ 
  if (bt==NULL)              /*递归调用的结束条件*/
      return;      
         
  PreOrder(bt->lchild);      /*先序递归遍历bt的左子树*/

  Visite(bt->data);          /*访问结点的数据域*/

  PreOrder(bt->rchild);      /*先序递归遍历bt的右子树*/  
}
void PostOrder(BiTree bt)    /*后序遍历二叉树bt*/
{  
    if (bt==NULL)            /*递归调用的结束条件*/
        return;    

    PostOrder(bt->lchild);   /*后序递归遍历bt的左子树*/
    PostOrder(bt->rchild);   /*后序递归遍历bt的右子树*/  

    Visite(bt->data);        /*访问结点的数据域*/
}
void LevelOrder(BiTree bt)   /*层次遍历二叉树bt*/
{ 
    Queue q=Init_Queue();    /*队列初始化*/

    BiTree x=0;                 /*队列暂存数据*/

     if (bt==NULL) 
         return;

        In_Queue(q,bt);          /*入队*/

      while(!Empty_Queue(q))     /*如果队列不为空*/
      {
          OutQueue(q,&x);                     /*取出队列数据*/
          Visite(x->data);                    /*访问队首结点的数据域*/
          if (x->lchild!=NULL)                /*将队首结点的左孩子结点入队列*/
               In_Queue(q, x->lchild);

          if (x->rchild!=NULL)                /*将队首结点的右孩子结点入队列*/
              In_Queue(q, x->rchild);
      }
         Destroy_Queue(&q);                   
}
void NRPreOrder(BiTree bt)   /*非递归先序遍历二叉树*/
{
    BiTree stack[MAXSIZE]={0};
    BiTree p=NULL;

    int top=0;

    if(bt==NULL)
        return;

    p=bt;

    while(!(p=NULL&&top==0))
    {
        while(p!=NULL)
        {
                  /*访问节点的数据域*/
            if(top<MAXNODE-1)     /*将当前指针p压栈*/
            {
                stack[top]=p;
                top++;
            }
            else
            {
                printf("栈溢出");
                return; 
            }

            p=p->lchild;             /*指针指向p的左孩子*/
        }

        if(top<=0)
            return;       /*栈空时结束*/
        else
        {
            top--;
            p=stack[top];       /*从栈中弹出栈顶元素*/
            Visite(p->data);     
            p=p->rchild;       /*指针指向p的右孩子节点*/
        }
    }
}
void Destroy (BiTree *bt)
{
      if(*bt)
      {
           Destroy(&(*bt)->lchild);
           Destroy(&(*bt)->rchild);
           free(*bt);
      }
      *bt=NULL;
}


[此贴子已经被作者于2017-3-25 14:03编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-25 14:00
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
那个按层遍历那里看看怎么完善~~~~这个还是要去查查资料才行~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-25 14:11
遗情处有诗章
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2017-3-10
得分:0 
回复 4楼 九转星河 求助
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE  1024
#define MAXNODE  1024

typedef struct QueueNode
{
    char s[MAXSIZE];    /*队列存放数据*/
    int front;          /*队列头指针*/
    int rear;           /*队列尾指针*/

}QueueNode,*Queue;



typedef struct BiTNode
{
  char  data;
  struct BiTNode *lchild,*rchild;    /*左右孩子指针*/
}BiTNode,*BiTree;

Queue Init_Queue();                 /*队列初始化*/
void In_Queue(Queue q,BiTree bt);   /*入队*/
void OutQueue(Queue q,BiTree* x);   /*出队并取其数据*/
void Destroy_Queue(Queue* q);       /*销毁队列*/

int Empty_Queue(Queue q);           /*判断队列是否为空*/
int Full_Queue(Queue q);            /*判断队列是否为满*/


int Initiate (BiTree bt);           /*初始化二叉树*/
void PreOrder(BiTree bt);           /*前序遍历*/
void InOrder(BiTree bt);            /*中序遍历*/
void PostOrder(BiTree bt);          /*后序遍历*/
void LevelOrder(BiTree bt);         /*层次遍历*/
void NRPreOrder(BiTree bt);         /*非递归前序遍历*/
void NRInOrder(BiTree bt);         /*非递归中序遍历*/
void Destroy (BiTree* bt);          /*销毁二叉树*/

void Visite(char c)
{
    printf("%c",c);
}


int main()  /*主函数*/
{
    BiTree bt;  
    printf("请输入数据\n");  
   Initiate(bt);  
  
    printf("\n前序遍历结果:\n");  
    PreOrder(bt);  
    printf("\n前序非递归遍历结果:\n");  
    NRPreOrder(bt);  
  
    printf("\n中序遍历结果:\n");  
    InOrder(bt);  
    printf("\n中序非递归遍历结果:\n");  
    NRInOrder(bt);  
  
    printf("\n后序遍历结果:\n");  
    PostOrder(bt);  
   
   
}  


Queue Init_Queue()
{
    Queue p=(Queue)malloc(sizeof (QueueNode));

    if (p==NULL)
    {
        puts("申请空间失败!");
        return NULL;
    }

    memset(p->s,0,sizeof(p->s));

    p->front=p->rear=0;

    return p;
}

void In_Queue(Queue q,BiTree bt)   /*入队*/
{
    if (Full_Queue(q))
        return ;

    ++q->rear;
    q->rear%=MAXSIZE;
    bt->data=q->s[q->rear];
}

void OutQueue(Queue q,BiTree* bt)       /*出队*/
{
    if (Empty_Queue(q))
        return ;

    ++q->front;
    q->front%=MAXSIZE;
    (*bt)->data=q->s[q->front];

}

int Empty_Queue(Queue q)         /*判断队列是否为空*/
{
    return q->front==q->rear;
}

void Destroy_Queue(Queue* q)       /*销毁队列*/
{
    if (*q)
        free(*q);

    *q=NULL;
}

int Full_Queue(Queue q)
{
    return q->front==q->rear+1;  /*判断是否队满*/
}

int Initiate (BiTree bt)   /*初始化建立二叉树*bt的头结点*/
{   
    scanf("%d",&bt);  
   
   
     if((bt=(BiTNode*)malloc(sizeof(BiTNode)))==NULL)
            return 0;

     bt->lchild=NULL;
     bt->rchild=NULL;
     return 1;
}
 
void PreOrder(BiTree bt)       /*先序遍历二叉树bt*/
{  
  if (bt==NULL)
      return;                  /*递归调用的结束条件*/

  Visite(bt->data);           /*访问结点的数据域*/

  PreOrder(bt->lchild);       /*先序递归遍历bt的左子树*/
  PreOrder(bt->rchild);       /*先序递归遍历bt的右子树*/  
}
void InOrder(BiTree bt)       /*中序遍历二叉树bt*/
{
  if (bt==NULL)              /*递归调用的结束条件*/
      return;      
         
  PreOrder(bt->lchild);      /*先序递归遍历bt的左子树*/

  Visite(bt->data);          /*访问结点的数据域*/

  PreOrder(bt->rchild);      /*先序递归遍历bt的右子树*/  
}
void PostOrder(BiTree bt)    /*后序遍历二叉树bt*/
{  
    if (bt==NULL)            /*递归调用的结束条件*/
        return;   

    PostOrder(bt->lchild);   /*后序递归遍历bt的左子树*/
    PostOrder(bt->rchild);   /*后序递归遍历bt的右子树*/  

    Visite(bt->data);        /*访问结点的数据域*/
}
void LevelOrder(BiTree bt)   /*层次遍历二叉树bt*/
{
    Queue q=Init_Queue();    /*队列初始化*/

    BiTree x=0;                 /*队列暂存数据*/

     if (bt==NULL)
         return;

        In_Queue(q,bt);          /*入队*/

      while(!Empty_Queue(q))     /*如果队列不为空*/
      {
          OutQueue(q,&x);                     /*取出队列数据*/
          Visite(x->data);                    /*访问队首结点的数据域*/
          if (x->lchild!=NULL)                /*将队首结点的左孩子结点入队列*/
               In_Queue(q, x->lchild);

          if (x->rchild!=NULL)                /*将队首结点的右孩子结点入队列*/
              In_Queue(q, x->rchild);
      }
         Destroy_Queue(&q);                  
}
void NRPreOrder(BiTree bt)   /*非递归先序遍历二叉树*/
{
    BiTree stack[MAXSIZE]={0};
    BiTree p=NULL;

    int top=0;

    if(bt==NULL)
        return;

    p=bt;

    while(!(p=NULL&&top==0))
    {
        while(p!=NULL)
        {
                  /*访问结点的数据域*/
            if(top<MAXNODE-1)     /*将当前指针p压栈*/
            {
                stack[top]=p;
                top++;
            }
            else
            {
                printf("???");
                return;
            }

            p=p->lchild;             /*指针指向p的左孩子*/
        }

        if(top<=0)
            return;       /*栈空时结束*/
        else
        {
            top--;
            Visite(p->data);
              p=stack[top];       /*从栈中弹出栈顶元素*/
            p=p->rchild;       /*指针指向p的右孩子结点*/
        }
    }
}
void NRInOrder(BiTree bt)   /*非递归中序遍历二叉树*/
{
    BiTree stack[MAXSIZE]={0};
    BiTree p=NULL;

    int top=0;

    if(bt==NULL)
        return;

    p=bt;

    while(!(p=NULL&&top==0))
    {
        while(p!=NULL)
        {
                  /*访问结点的数据域*/
            if(top<MAXNODE-1)     /*将当前指针p压栈*/
            {
                stack[top]=p;
                top++;
            }
            else
            {
                printf("???");
                return;
            }

            p=p->lchild;             /*指针指向p的左孩子*/
        }

        if(top<=0)
            return;       /*栈空时结束*/
        else
        {
            top--;
            p=stack[top];       /*从栈中弹出栈顶元素*/
            Visite(p->data);     
            p=p->rchild;       /*指针指向p的右孩子结点*/
        }
    }
}
void Destroy (BiTree *bt)
{
      if(*bt)
      {
           Destroy(&(*bt)->lchild);
           Destroy(&(*bt)->rchild);
           free(*bt);
      }
      *bt=NULL;
}

谢谢你帮助我补充修改的代码
输入数据我打的也有很多错误可以再帮我看一下吗
求助
2017-03-25 20:05
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 6楼 遗情处有诗章
按层遍历那里我还要想想看怎么弄~诶~看来我先要弄清楚堆排序原理才能弄~因为感觉按层遍历队列数组存放数据的结构就是和堆排序的是一样的~如果不用数组队列来个链表就头大了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-25 20:29
遗情处有诗章
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2017-3-10
得分:0 
回复 7楼 九转星河
谢谢啦 我真的是一头雾水啊 好几天也搞不出来的作业啊
2017-03-25 20:36
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 8楼 遗情处有诗章
我也是刚学二叉树不久~感觉还要大改~我试试看~这个程序可能要花比较多的时间去弄~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-25 20:45
遗情处有诗章
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2017-3-10
得分:0 
回复 9楼 九转星河

初始化那里有问题
要咋改呢
2017-03-25 22:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-475470-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.073279 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved