| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3635 人关注过本帖
标题:二叉树基本操作 节点的计算问题
取消只看楼主 加入收藏
盆中线
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-11-6
结帖率:100%
收藏
 问题点数:0 回复次数:5 
二叉树基本操作 节点的计算问题
我用前序遍历来计算节点数,可是发现那个计算只加了一次。
#include  <stdio.h>
#include  <malloc.h>
#include  <process.h>
#define MaxTreeSize  100
#define OVERFLOW -2
#define OK 1
#define ERROR 0
typedef char TElemType;
typedef int Status;
typedef struct BiTNode{
    TElemType  data;
    struct BiTNode  *lchild,*rchild;
}BiTNode,*BiTree;

Status CreateBiTree(BiTree *T){
    char c;
    scanf("%c",&c);
    if(c=='#')
        *T=NULL;
    else{
        if(!(*T=(BiTNode *)malloc(sizeof(BiTNode))))
            exit(OVERFLOW);
        (*T)->data=c;
        CreateBiTree(&(*T)->lchild);
        CreateBiTree(&(*T)->rchild);
    }
    return OK;
}

Status Visit(TElemType e){
    printf("%c",e);
    return OK;
}

Status PreOrderTraverse(BiTree T,Status(* Visit)(TElemType e)){
    int  *count = 0;
    if(T){
        if(Visit(T->data))
            *count++;
        if(PreOrderTraverse(T->lchild,Visit))
            if(PreOrderTraverse(T->rchild,Visit))
                return OK;
            return ERROR;
    }
    else return OK;
    return *count;
}

void main(){
    BiTree T;
    printf("构建空二叉树\n");
    printf("向二叉树各节点赋值\n");
    CreateBiTree(&T);
    int n;
    n=PreOrderTraverse(T,Visit);
    printf("\n该二叉树共有%d个结点",n);
}

我输入 AA##A##
然后,节点数就只有1,但是那个遍历左右孩子都遍历的了。这个是为什么呢?
我想问题是在前序遍历那里的count。。但是就是不知道怎么弄。。
搜索更多相关主题的帖子: 二叉树 节点 
2008-11-30 14:01
盆中线
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-11-6
收藏
得分:0 
错了。。。我概念弄错了。。。sorry。。代码没错
2008-11-30 14:16
盆中线
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-11-6
收藏
得分:0 
还是有错。。。当我输入aa##aa##a##时,还是只有1个节点
帮帮忙~~~~~~~~~
2008-11-30 14:26
盆中线
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-11-6
收藏
得分:0 
那我上面的代码不能求出节点数吗?
2008-11-30 15:32
盆中线
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-11-6
收藏
得分:0 
回复 第7楼 geninsf009 的帖子
这个是树的创建,没错吧,不然在Preoder时,是不会遍历到的。visit函数能输出那些结点,但是count不加,树的创建没错吧。
2008-12-02 17:04
盆中线
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-11-6
收藏
得分:0 
我想我的程序写为能计算双亲结点。但是我改称这样了:
int n=0;
Status PreOrderTraverse(BiTree T,Status(* visit)(TElemType  )){
   
    
    if(T){
        if(visit(T->data))
            n++;
        if(PreOrderTraverse(T->lchild,visit))
            if(PreOrderTraverse(T->rchild,visit))
                return OK;
            return ERROR;
    }
    else return OK;
    return n;
}
还是错的。。。。会不会是把n看成了局部变量,所以导致每次用PreOderTraverse时,都将n的值初始化呢?

我想知道这个代码哪里不对。。因为我换了种算法,试验做了。但是这个哪里错了呢?

[[it] 本帖最后由 盆中线 于 2008-12-2 17:19 编辑 [/it]]
2008-12-02 17:17
快速回复:二叉树基本操作 节点的计算问题
数据加载中...
 
   



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

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