| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1078 人关注过本帖
标题:简单计算二叉树各结点data的和
只看楼主 加入收藏
三尺冰
Rank: 2
等 级:论坛游民
帖 子:17
专家分:50
注 册:2019-10-22
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:2 
简单计算二叉树各结点data的和
程序代码:
#include<stdio.h>
#include<stdlib.h>

/**
*简单地创建一棵树
*三个函数: 1.先序遍历创建树,-1作为空指针标志
*      2.输出先序遍历序列
*      3.计算所有结点data域的和
*在main函数中声明指向根结点的指针变量
*并输出和sum
*/

typedef struct tree
{
    int data;
    struct tree *lchild, *rchild;
}Tree;      //结构体声明
   

int main()
{

    void createTree(Tree *t);
    int calSum(Tree *t);
    void dispTree(Tree *t);     //函数声明

    Tree *t;       

   

    int sum;
    createTree(t);
    sum = calSum(t);
    dispTree(t);       

    printf("%d\n", sum);    //创建、计算sum、输出先序序列和输出sum

    return 0;
}

void createTree(Tree *t)
{
    int x;
    scanf("%d", &x);
    if(x == -1)
        t = NULL;
    t = (Tree *)malloc(sizeof(Tree));
    t->data = x;
    createTree(t->lchild);
    createTree(t->rchild);
}

int calSum(Tree *t)
{
    if(!t)  return 0;
    return calSum(t->lchild) + calSum(t->rchild) + t->data;
}

void dispTree(Tree *t)
{
    if(t)
    {
        printf("%d  ", t->data);
        dispTree(t->lchild);
        dispTree(t->rchild);
    }
}

问题在于数据输入结束后无响应
测试数据:2 3 -1 6 -1 -1 9 -1 -1
数据输完不会结束,输入非数字数据,程序崩溃。
递归用的可能不熟,诚心请教!
搜索更多相关主题的帖子: data tree int 结点 sum 
2019-11-11 23:47
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:20 
程序代码:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

typedef struct tree
{
    int data;
    struct tree *lchild, *rchild;
} Tree;

bool CreateTree( Tree** t );
void DispTree( const Tree* t );
int CalSum( const Tree* t );

int main( void )
{
    Tree* t;
    CreateTree( &t );
    DispTree(t);
    printf( "\n%d\n", CalSum(t) );
}

bool CreateTree( Tree** t )
{
    int val;
    if( scanf("%d",&val) != 1 )
        return false;
    if( val == -1 )
    {
        *t = NULL;
        return true;
    }
    (*t) = malloc(sizeof(Tree));
    (*t)->data = val;
    return CreateTree(&(*t)->lchild) && CreateTree(&(*t)->rchild);
}

void DispTree( const Tree* t )
{
    if( !t )
    {
        printf( "%d ", -1 );
        return ;
    }

    printf( "%d ", t->data );
    DispTree( t->lchild );
    DispTree( t->rchild );
}

int CalSum( const Tree* t )
{
    if( !t )
        return 0;
    return CalSum(t->lchild) + CalSum(t->rchild) + t->data;
}
2019-11-12 08:52
三尺冰
Rank: 2
等 级:论坛游民
帖 子:17
专家分:50
注 册:2019-10-22
收藏
得分:0 
CreateTree函数是递归进行的,每次递归也只是用实参的副本,为什么还是要
使用t的二级指针呢?


天道酬勤,自强不息
2019-11-15 12:31
快速回复:简单计算二叉树各结点data的和
数据加载中...
 
   



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

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