| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3982 人关注过本帖
标题:初学二叉树 求助 一直显示函数未定义 可是我根本不会定义啊
只看楼主 加入收藏
遗情处有诗章
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2017-3-10
收藏
得分:0 
回复 9楼 九转星河
#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  index=0;
char node[10];
int Initiate (BiTree bt)   /*初始化建立二叉树*bt的头结点*/
{   char ch;
ch = node[index++];
    scanf("%d",&bt);  
    if('#' == ch)  
     {  
       bt = NULL;  
     }  
    else{
        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 23:00
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 10楼 遗情处有诗章
试试这样~

程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define LEN sizeof (BiTree)

typedef struct BiTree
{

    int data;                //存放数据
    struct BiTree* left;     //左孩子
    struct BiTree* right;    //右孩子
}BiTree,*PBiTree;

void Creat_Tree(PBiTree* p);                     //创建二叉树
int Add_Tree(PBiTree* p,int data,int n,int m);   //输入数据
int Get_Height(PBiTree p);                       //获取深度 

void Visit(PBiTree p);

void Pre_Order(PBiTree p);     //前序遍历
void In_Order(PBiTree p);      //中序遍历
void Post_Order(PBiTree p);    //后序遍历

void Visit(PBiTree p);         //访问节点数据

void Del_Tree(PBiTree* p);     //释放树


int main()
{
    PBiTree p=NULL;
    int n=0;
    int i=0;
    int data=0;

    printf("请输入节点个数:");
    scanf("%d",&n);

    for (i=0;i!=n;++i)
    {
        printf("请输入第%d个节点的数据:",i+1);
        scanf("%d",&data);
        Add_Tree(&p,data,1,1);
    }

    printf("二叉树深度为%d:\n",Get_Height(p));

    puts("前序遍历结果为:");
    Pre_Order(p);
    puts("");

    puts("中序遍历结果为:");
    In_Order(p);
    puts("");

    puts("后序遍历结果为:");
    Post_Order(p);
    puts("");

    Del_Tree(&p);

    return 0;
}

void Creat_Tree(PBiTree* p)
{
    if ((*p=(PBiTree)malloc(LEN))==NULL)
    {
        puts("创建失败!");
        return ;
    }

    memset(*p,0,LEN);
}

int Add_Tree(PBiTree* p,int data,int n,int m)  //输入数据 
{
    int k=0;

    if (n>m)
        return 0;

    if (*p==NULL)
    {
        Creat_Tree(p);
        (*p)->data=data;

        return 1;
    }

    if (!k)
        k=Add_Tree((&(*p)->left),data,n+1,m);

    if (!k)
        k=Add_Tree((&(*p)->right),data,n+1,m);

    while (!k&&n==1)
    {
        ++m;
        k=Add_Tree(p,data,n+1,m);
    }

    return k;
}

void Visit(PBiTree p)         //访问节点数据
{
    printf("%4d",p->data);
}

void Pre_Order(PBiTree p)     //前序遍历
{
    if (p==NULL)
        return ;

    Visit(p);

    Pre_Order(p->left);
    Pre_Order(p->right);
}

void In_Order(PBiTree p)      //中序遍历
{
    if (p==NULL)
        return ;

    In_Order(p->left);

    Visit(p);

    In_Order(p->right);
}
void Post_Order(PBiTree p)    //后序遍历
{
    if (p==NULL)
        return ;

    Post_Order(p->left);
    Post_Order(p->right);

    Visit(p);
}

int Get_Height(PBiTree p)    //获取深度
{
    int l=0;   
    int r=0;  

    if (p==NULL)
        return 0;

    l=Get_Height(p->left)+1;
    r=Get_Height(p->right)+1;

    return l>r?l:r;
}

void Del_Tree(PBiTree* p)       //释放树
{
    if (*p==NULL)
        return ;

    Del_Tree(&((*p)->left));
    Del_Tree(&((*p)->right));

    free(*p);
    *p=NULL;
}


[此贴子已经被作者于2017-3-26 11:49编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-26 11:20
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
感觉我自己想的生成完全二叉树的方法每次都要重新遍历一次节点~不是太理想~

生成完全二叉树的方法可以参考http://blog.
~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-26 11:39
遗情处有诗章
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2017-3-10
收藏
得分:0 
回复 13楼 九转星河
还有非递归的先序遍历和非递归中序遍历我调试了好久 也没搞出来
2017-03-26 14:44
遗情处有诗章
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2017-3-10
收藏
得分:0 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE  1024
#define MAXNODE  1024
#define LEN sizeof (BiTree)

typedef struct BiTree
{

    int data;                //存放数据
    struct BiTree* left;     //左孩子
    struct BiTree* right;    //右孩子
}BiTree,*PBiTree;

void Creat_Tree(PBiTree* p);                     //创建二叉树
int Add_Tree(PBiTree* p,int data,int n,int m);   //输入数据
int Get_Height(PBiTree p);                       //获取深度

void Visit(PBiTree p);

void Pre_Order(PBiTree p);     //前序遍历
void In_Order(PBiTree p);      //中序遍历
void Post_Order(PBiTree p);    //后序遍历
void NRPre_Order(PBiTree p);
void Visit(PBiTree p);         //访问节点数据

void Del_Tree(PBiTree* p);     //释放树


int main()
{
    PBiTree p=NULL;
    int n=0;
    int i=0;
    int data=0;

    printf("请输入节点个数:");
    scanf("%d",&n);

    for (i=0;i!=n;++i)
    {
        printf("请输入第%d个节点的数据:",i+1);
        scanf("%d",&data);
        Add_Tree(&p,data,1,1);
    }

    printf("二叉树深度为%d:\n",Get_Height(p));

    puts("前序遍历结果为:");
    Pre_Order(p);
    puts("");

    puts("中序遍历结果为:");
    In_Order(p);
    puts("");

    puts("后序遍历结果为:");
    Post_Order(p);
    puts("");

    puts("非递归先序遍历结果为:");
    NRPre_Order(p);
    puts("");
   
    Del_Tree(&p);

    return 0;
}

void Creat_Tree(PBiTree* p)
{
    if ((*p=(PBiTree)malloc(LEN))==NULL)
    {
        puts("创建失败!");
        return ;
    }

    memset(*p,0,LEN);
}

int Add_Tree(PBiTree* p,int data,int n,int m)  //输入数据
{
    int k=0;

    if (n>m)
        return 0;

    if (*p==NULL)
    {
        Creat_Tree(p);
        (*p)->data=data;

        return 1;
    }

    if (!k)
        k=Add_Tree((&(*p)->left),data,n+1,m);

    if (!k)
        k=Add_Tree((&(*p)->right),data,n+1,m);

    while (!k&&n==1)
    {
        ++m;
        k=Add_Tree(p,data,n+1,m);
    }

    return k;
}


void Visit(PBiTree p)         //访问节点数据
{
    printf("%4d",p->data);
}

void Pre_Order(PBiTree p)     //先序遍历
{
    if (p==NULL)
        return ;

    Visit(p);

    Pre_Order(p->left);
    Pre_Order(p->right);
}

void In_Order(PBiTree p)      //中序遍历
{
    if (p==NULL)
        return ;

    In_Order(p->left);

    Visit(p);

    In_Order(p->right);
}
void Post_Order(PBiTree p)    //后序遍历
{
    if (p==NULL)
        return ;

    Post_Order(p->left);
    Post_Order(p->right);

    Visit(p);
}
void NRPre_Order(PBiTree p)   /*非递归先序遍历二叉树*/
{
    PBiTree stack[MAXNODE],t;
    int top;
    if(p==NULL)
    return;
    top=0;
    t=p;
    while(!(t==NULL&&top==0))
    {
        while(t!=NULL)
        {
            Visit(t->data);
            if(top<MAXNODE-1)
            {
                stack[top]=t;
                top++;
            }
            else {
                printf("栈溢出");
            
            return;
        }
        t=t->left;
        
    }
    if(top<=0)
    return;
    else{
        top--;
        t=stack[top];
        t=t->right;
    }
}
}
int Get_Height(PBiTree p)    //获取深度
{
    int l=0;   
    int r=0;  

    if (p==NULL)
        return 0;

    l=Get_Height(p->left)+1;
    r=Get_Height(p->right)+1;

    return l>r?l:r;
}

void Del_Tree(PBiTree* p)       //释放树
{
    if (*p==NULL)
        return ;

    Del_Tree(&((*p)->left));
    Del_Tree(&((*p)->right));

    free(*p);
    *p=NULL;
}
2017-03-26 15:06
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
有时间我继续完善~要专攻二叉树了~

先搜藏~现在到九九向你学习二叉树了~~

[此贴子已经被作者于2017-3-26 16:37编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-26 16:30
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
新增了一个按层遍历~感觉用数组代替链表会比较简单~

程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define  LEN  sizeof  (BiTree)
#define  LEN_Qnode  sizeof  (Qnode)
#define  LEN_Stack  sizeof  (Stack)


typedef  struct  BiTree
{

    int  data;                                //存放数据
    struct  BiTree*  left;          //左孩子
    struct  BiTree*  right;        //右孩子
}BiTree,*PBiTree;

typedef  struct  Stack
{
    PBiTree  p;
    int flag;
    struct  Stack*  next;
}Stack,*PStack;

typedef  struct  LinkStack
{
    PStack  base;
    PStack  top;
}LinkStack,*PLinkStack;

typedef  struct  Queue
{
    PBiTree  p;
    struct  Queue*  next;
}Qnode,*PQnode;

typedef  struct  LinkQnode
{
    PQnode  front;
    PQnode  rear;
}LinkQnode,*PLinkQnode;

void  Creat_Stack(PLinkStack  s);                                    //创建一个栈
void  Push_Stack(PBiTree  p,PLinkStack  s);                  //入栈
void  Pop_Stack(PLinkStack  s);                                        //出栈
void  Del_Stack(PLinkStack  s);                                        //清空栈
int  Empty_Stack(PLinkStack  s);                                      //判断是否栈空

void  Creat_Qnode(PLinkQnode  q);                                    //创建一个队列
void  Push_Qnode(PBiTree  p,PLinkQnode  q);                  //入队
void  Out_Qnode(PLinkQnode  q);                                        //出队
void  Del_Qnode(PLinkQnode  q);                                        //释放队列
int  Empty_Qnode(PLinkQnode  q);                                      //判断队列是否为空

void  Creat_Tree(PBiTree*  p);                                          //创建二叉树
int  Add_Tree(PBiTree*  p,int  data,int  n,int  m);      //输入数据
int  Get_Height(PBiTree  p);                                              //获取深度  

void  Visit(PBiTree  p);

void  Pre_Order(PBiTree  p);                                //前序遍历
void  In_Order(PBiTree  p);                                  //中序遍历
void  Post_Order(PBiTree  p);                              //后序遍历
void  Laver_Order(PBiTree  p);                            //按层遍历
  
void  NRPre_Order(PBiTree  p);                            //非递归前序遍历

void  Visit(PBiTree  p);                                        //访问节点数据
void  Visit_Layer(int  a);                        

void  Get_Date(PBiTree  p,PQnode  qnode);        //获取数据

void  Del_Tree(PBiTree*  p);                                //释放树


int  main()
{
    PBiTree  p=NULL;
    int  n=0;
    int  i=0;
    int  data=0;

    printf("请输入节点个数:");
    scanf("%d",&n);

    for  (i=0;i!=n;++i)
    {
        printf("请输入第%d个节点的数据:",i+1);
        scanf("%d",&data);
        Add_Tree(&p,data,1,1);
    }

    printf("二叉树深度为%d:\n",Get_Height(p));

    puts("前序遍历结果为:");
    Pre_Order(p);
    puts("");

    puts("中序遍历结果为:");
    In_Order(p);
    puts("");

    puts("后序遍历结果为:");
    Post_Order(p);
    puts("");

    puts("按层遍历的结果为:");
    Laver_Order(p);
    puts("");

    puts("非递归前序遍历结果为:");
    NRPre_Order(p);
    puts("");      

    Del_Tree(&p);

    return  0;
}

void  Creat_Stack(PLinkStack  s)                                    //创建一个栈
{
    s->base=s->top=(PStack)malloc(LEN_Stack);

    if  (s->base==NULL)
    {
        puts("申请空间失败!");
        exit(0);
    }

    memset(s->base,0,LEN_Stack);
}

void  Push_Stack(PBiTree  p,PLinkStack  s)                  //入栈
{
    PStack  t=(PStack)malloc(LEN_Stack);
    t->next=s->top;
    
    t->p=p;
    t->flag=0;
    
    s->top=t;
}

void  Pop_Stack(PLinkStack  s)                                        //出栈
{
    PStack  t=s->top;

    if  (Empty_Stack(s))
        return  ;

    s->top=s->top->next;
    free(t);
}

void  Del_Stack(PLinkStack  s)                                        //清空栈
{
    while  (!Empty_Stack(s))
        Pop_Stack(s);
}

int  Empty_Stack(PLinkStack  s)                                      //判断是否栈空
{
    return  s->top==s->base;
}

void  Creat_Qnode(PLinkQnode  q)
{
    q->front=q->rear=(PQnode)malloc(LEN_Qnode);

    if  (q->front==NULL)
    {
        puts("申请空间失败!");
        exit(0);
    }

    memset(q->front,0,LEN_Qnode);
}

void  Push_Qnode(PBiTree  p,PLinkQnode  q)                                //入队
{
    q->rear=q->rear->next=(PQnode)malloc(LEN_Qnode);
    q->rear->next=NULL;
    q->rear->p=p;
}

void  Out_Qnode(PLinkQnode  q)                                        //出队
{
    PQnode  tem=q->front->next;

    if  (Empty_Qnode(q))
        return  ;

    free(q->front);

    q->front=tem;
    tem=tem->next;

    memset(q->front,0,LEN_Qnode);

    q->front->next=tem;
}

void  Del_Qnode(PLinkQnode  q)                                        //释放队列
{
    while  (!Empty_Qnode(q))
        Out_Qnode(q);
}

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

void  Creat_Tree(PBiTree*  p)
{
    if  ((*p=(PBiTree)malloc(LEN))==NULL)
    {
        puts("创建失败!");
        return  ;
    }

    memset(*p,0,LEN);
}

int  Add_Tree(PBiTree*  p,int  data,int  n,int  m)    //输入数据  
{
    int  k=0;

    if  (n>m)
        return  0;

    if  (*p==NULL)
    {
        Creat_Tree(p);
        (*p)->data=data;

        return  1;
    }

    if  (!k)
            k=Add_Tree((&(*p)->left),data,n+1,m);

    if  (!k)
        k=Add_Tree((&(*p)->right),data,n+1,m);

    while  (!k&&n==1)
    {
        ++m;
            k=Add_Tree(p,data,n+1,m);
    }

    return  k;
}

void  Visit(PBiTree  p)                  //访问节点数据
{
    printf("%4d",p->data);
}

void  Visit_Layer(int  a)
{
    printf("%4d",a);
}

void  Pre_Order(PBiTree  p)          //前序遍历
{
    if  (p==NULL)
        return  ;

    Visit(p);

    Pre_Order(p->left);
    Pre_Order(p->right);
}

void  In_Order(PBiTree  p)            //中序遍历
{
    if  (p==NULL)
        return  ;

    In_Order(p->left);

    Visit(p);

    In_Order(p->right);
}
void  Post_Order(PBiTree  p)        //后序遍历
{
    if  (p==NULL)
        return  ;

    Post_Order(p->left);
    Post_Order(p->right);

    Visit(p);
}

int  Get_Height(PBiTree  p)        //获取深度
{
    int  l=0;      
    int  r=0;    

    if  (p==NULL)
        return  0;

    l=Get_Height(p->left)+1;
    r=Get_Height(p->right)+1;

    return  l>r?l:r;
}
  
void  Del_Tree(PBiTree*  p)                    //释放树
{
    if  (*p==NULL)
        return  ;

    Del_Tree(&((*p)->left));
    Del_Tree(&((*p)->right));

    free(*p);
    *p=NULL;
}

void  Laver_Order(PBiTree  p)              //按层遍历
{

    LinkQnode  q={0};

    Creat_Qnode(&q);

    Push_Qnode(p,&q);

    while  (!Empty_Qnode(&q))
    {
        if  (q.front->next->p->left!=NULL)
            Push_Qnode(q.front->next->p->left,&q);

        if  (q.front->next->p->right!=NULL)
            Push_Qnode(q.front->next->p->right,&q);

        Visit(q.front->next->p);

        Out_Qnode(&q);
    }

    free(q.front);
    q.rear->next=q.front->next=NULL;
}

void  NRPre_Order(PBiTree  p)                            //非递归前序遍历
{
    LinkStack  s={0};

    Creat_Stack(&s);

    Push_Stack(p,&s);
    
    while (!Empty_Stack(&s))  
    {
        if (s.top->p==NULL||s.top->flag==2)
        {
                Pop_Stack(&s);
                continue;
        }
       
       if (s.top->flag==0)
       { 
           ++s.top->flag;
           Visit(s.top->p);
           Push_Stack(s.top->p->left,&s);
           continue;
       } 
       
       if (s.top->flag==1)
       {
            ++s.top->flag;
            Push_Stack(s.top->p->right,&s);
       } 
    }
    
    free(s.top);
    s.top=s.base=NULL;
}



[此贴子已经被作者于2017-3-27 12:26编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-26 21:14
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 17楼 九转星河
更新了个非递归前序遍历的(其实是仿照递归原理)非递归中序遍历和非递归后序遍历类似这种写法~修改一下就行了~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-27 12:25
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:0 
回复 9楼 九转星河
用queue
void func(Node*root)
{
    queue<Node*> q;Node*tmp;
    q.push(root);
    while(!q.empty())
    {
        tmp=q.top();q.pop();
        //访问
        if(tmp有左孩子) 左孩入队;
        if(tmp有右孩子) 右孩入队;
    }
}
2017-03-27 13:48
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 19楼 yangfrancis
这个看过~如果没有记错应该是参考CSDN里面的~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-27 15:33
快速回复:初学二叉树 求助 一直显示函数未定义 可是我根本不会定义啊
数据加载中...
 
   



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

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