标题:二叉树深度及编译报警问题
只看楼主
Nekomimi
Rank: 2
等 级:论坛游民
帖 子:80
专家分:15
注 册:2006-11-21
结帖率:100%
 问题点数:0 回复次数:12 
二叉树深度及编译报警问题
#include <stdio.h>
#include <stddef.h>
#define NULL ((void *)0)
typedef struct{
    char e;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//建立二叉树
int creatT(BiTree *T){
    int c;
     scanf("%c",&c);
    if(c==' '){
        *T=NULL;
    }else{
        if(!((*T)=(BiTNode *)malloc(sizeof(BiTNode)))){
            printf("ERROR");
            return 0;
        }
        (*T)->e=c;
        creatT(&((*T)->lchild));
        creatT(&((*T)->rchild));
    }
    return 1;
}
//打印二叉树
void printfT(BiTree *T){
    if(*T==NULL){
        printf(" ");
    }else{
        printf("%c",(*T)->e);
        printfT(&((*T)->lchild));
        printfT(&((*T)->rchild));
    }
}
//计算结点
int countNT(BiTree *T,int n){
    static i=0;
    if(*T){
        if(!((*T)->lchild)&&!((*T)->rchild)){
            i++;
        }
        countNT(&((*T)->lchild),i);
        countNT(&((*T)->rchild),i);
    }
    n=i;
    return n;
}
//求深度
int depT(BiTree *T){
    int i=0,j=0;
    int dep;
    if(!*T){
        dep=0;
    }else{
        i=depT(&((*T)->lchild));
        j=depT(&((*T)->rchild));
    }
    dep=(i>j?i:j)+1;
    return dep;
}
int main(int argc, char *argv[])
{
    BiTree *T;
    int i,n=0;
    printf("please input elements:");
    creatT(&T);
    printfT(&T);
    i=countNT(&T,n);
    printf("\nnode is: %d",i);
    i=depT(&T);
    printf("\ndep is: %d",i);
    return 0;
}
深度算出来总是不对,比如:输入ab##c## (#表示空),结果输出的是3,应该是2才对呀。。
另外,编译时总是出现:[Warning] H:\main.c:70: warning: passing arg 1 of `depT' from incompatible pointer type
不止一句,所有函数出现的地方都出现了。。请教到底是什么原因啊。。
搜索更多相关主题的帖子: 深度 二叉树 编译 报警 
2010-01-22 20:28
rwyangguang
Rank: 2
等 级:论坛游民
帖 子:23
专家分:46
注 册:2009-7-7
得分:0 
typedef struct BiTNode{
    char e;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;



main函数定义   BiTree T;
子程序         BiTree &T;
T=(BiTNode *)malloc(sizeof(BiTNode))

可以看看结构体那块


别的楼主再看看吧,别人的电脑,没编译器,我是个懒人


2010-01-24 12:22
Nekomimi
Rank: 2
等 级:论坛游民
帖 子:80
专家分:15
注 册:2006-11-21
得分:0 
以下是引用rwyangguang在2010-1-24 12:22:01的发言:

typedef struct BiTNode{
    char e;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
加了“BiTNode”确实不报警了。。这个必须加的吗?我以前都没加。。
另外,深度为什么错了?和答案差不多的呀。。。
2010-01-24 22:27
rwyangguang
Rank: 2
等 级:论坛游民
帖 子:23
专家分:46
注 册:2009-7-7
得分:0 
BiTNode学的时候叫结构体名   建议你去看看结构体那块

int depT(BiTree &T)
{  if(!T)  return 0;
   if(!T->lchild&&!T->rchild)  return 1;
   return depT(T->lchild)>depT(T->rchild)?depT(T->lchild):depT(T->rchild);
}
我写的深度函数  没编译器  你去试试吧
2010-01-26 19:05
rwyangguang
Rank: 2
等 级:论坛游民
帖 子:23
专家分:46
注 册:2009-7-7
得分:0 
BiTNode学的时候叫结构体名   建议你去看看结构体那块

int depT(BiTree T)
{  if(!T)  return 0;
   if(!T->lchild&&!T->rchild)  return 1;
   return depT(T->lchild)>depT(T->rchild)?depT(T->lchild):depT(T->rchild);
}
我写的深度函数  没编译器  你去试试吧


上面那个&不能加  我错了
2010-01-26 19:07
Nekomimi
Rank: 2
等 级:论坛游民
帖 子:80
专家分:15
注 册:2006-11-21
得分:0 
以下是引用rwyangguang在2010-1-26 19:07:29的发言:

BiTNode学的时候叫结构体名   建议你去看看结构体那块

int depT(BiTree T)
{  if(!T)  return 0;
   if(!T->lchild&&!T->rchild)  return 1;
   return depT(T->lchild)>depT(T->rchild)?depT(T->lchild):depT(T->r ...
还是不得行呀。。。
2010-01-26 20:26
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
得分:0 
    BiTree *T;//这里T是指针了
    creatT(&T);//?你是要传引用还是地址?如果你用.c的话就有问题了
    printfT(&T);
    i=countNT(&T,n);
    printf("\nnode is: %d",i);
    i=depT(&T);

学习需要安静。。海盗要重新来过。。
2010-01-26 22:07
Nekomimi
Rank: 2
等 级:论坛游民
帖 子:80
专家分:15
注 册:2006-11-21
得分:0 
以下是引用sunkaidong在2010-1-26 22:07:19的发言:

    BiTree *T;//这里T是指针了
    creatT(&T);//?你是要传引用还是地址?如果你用.c的话就有问题了
    printfT(&T);
    i=countNT(&T,n);
    printf("\nnode is: %d",i);
    i=depT(&T);
大哥,能不能说详细点。。
我确实是想传地址,不行吗?.c有问题是指不能用c语言?
但是除了深度不能求出正确结果外,其余的都OK呀。。
2010-01-26 23:04
rwyangguang
Rank: 2
等 级:论坛游民
帖 子:23
专家分:46
注 册:2009-7-7
得分:0 
第一次当好人
#include <stdio.h>
#include<stdlib.h>
typedef struct BiTNode{
    char e;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void init_tree(BiTree &T)//初始化树
{   T=NULL;
}
int  insert_jiedian(BiTree &T)//插入节点
{   
    char a;
    scanf("%c",&a);
    if(a=='#')  {return 1;}
    T=(BiTree)malloc(sizeof(BiTNode));
    T->e=a;
    T->lchild=T->rchild=NULL;
    insert_jiedian(T->lchild);
    insert_jiedian(T->rchild);
    return 1;
}
int depT(BiTree &T,int s)
{  
if(!T)  return s;
if(!T->lchild&&!T->rchild) {s=s+1;return s;}
   return depT(T->lchild,s)>depT(T->rchild,s)?depT(T->lchild,s)+1:depT(T->rchild,s)+1;
}
void main()
{  int t;
   BiTree T1;
   init_tree(T1);
   insert_jiedian(T1);
   t=depT(T1,0);
   printf("%d\n",t);
  

   
}
2010-01-26 23:06
Nekomimi
Rank: 2
等 级:论坛游民
帖 子:80
专家分:15
注 册:2006-11-21
得分:0 
以下是引用rwyangguang在2010-1-26 23:06:39的发言:

第一次当好人
#include <stdio.h>
#include<stdlib.h>
typedef struct BiTNode{
    char e;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void init_tree(BiTree &T)//初始化树
{   T=NULL;
}
int  inse ...
[IMG]http://i32.[/IMG]
运行不了啊。。。
2010-01-26 23:16



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




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

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