| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3640 人关注过本帖
标题:二叉树基本操作 节点的计算问题
只看楼主 加入收藏
盆中线
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-11-6
结帖率:100%
收藏
 问题点数:0 回复次数:19 
二叉树基本操作 节点的计算问题
我用前序遍历来计算节点数,可是发现那个计算只加了一次。
#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
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
前序遍历求结点数是什么意思?
是设置一个static 变量,每访问一个结点就加1吗?

我觉得普通的递归求解思路,总结点数=递归求解右子树
结点数+递归求解左子树结点数,也可以属于前续遍历的
应用啊.
2008-11-30 14:53
盆中线
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-11-6
收藏
得分:0 
那我上面的代码不能求出节点数吗?
2008-11-30 15:32
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
我刚刚照你的思路也写了一个递归算法,代码如下,已经通过测试了,能正确运行,你参考一下吧:
/////////////////////////////////////////////////
//PreOrderCount()公有成员函数
//通过前序遍历来统计当前二叉树中的结点的个数
/////////////////////////////////////////////////
template<class T>
int BinaryTree<T>::PreOrderCount(
                BinTreeNode<T>* subTree)
{
    static int count=0;               //静态计数器
    if(subTree!=NULL)                 //当前结点统计加1
    {
        count++;
        if(subTree->leftChild!=NULL)  //如果左子树不空
            PreOrderCount(
                subTree->leftChild);  //递归统计左子树的结点个数
        if(subTree->rightChild!=NULL) //如果右子树不空
            PreOrderCount(
                subTree->rightChild); //递归统计右子树的结点个数
        return count;
    }
    else
        return count;
};
//////////////////////////PreOrderCount()函数结束
2008-11-30 19:54
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
完整的二叉树类的代码由于篇幅过大就不提供了,相比LZ一看就懂,不需要自己运行了。好象基本结构和LZ写的代码基本是差不多的。我的已经测试过几个二叉树是正确的:
实验结果如下:
输入的二叉树:"A(B(C(D,H),),E(F,G(J,K)))#"      结果为10;
输入的二叉树:"A(B(C(D,),),E(F,G(,K)))#"        结果为8;
输入的二叉树:"A(B(C(D,H),),E(F,G(J,K(L,M))))#" 结果为12。

[[it] 本帖最后由 geninsf009 于 2008-11-30 20:00 编辑 [/it]]
2008-11-30 19:56
missiyou
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:531
专家分:218
注 册:2007-10-9
收藏
得分:0 
只输出一个结点,说明树根本就没有实现链接,
我猜的话,应该是这个地方有问题!
CreateBiTree(&(*T)->lchild);
        CreateBiTree(&(*T)->rchild);
改为'
(*T)->lchild=CreateBiTree(&(*T)->lchild);
   (*T)->lchild=     CreateBiTree(&(*T)->rchild);
还有,如果在错的话,应该就是这了,CreateBiTree(&(*T)->rchild);去掉这个&
2008-11-30 20:23
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
LS说的有道理,我觉得自己的程序阅读能力太差了,只顾自己编写...
2008-11-30 20:24
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
int  *count = 0;
count 是同一个吗?

倚天照海花无数,流水高山心自知。
2008-11-30 20:36
快速回复:二叉树基本操作 节点的计算问题
数据加载中...
 
   



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

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