注册 登录
编程论坛 C语言论坛

简单计算二叉树各结点data的和

三尺冰 发布于 2019-11-11 23:47, 1381 次点击
程序代码:
#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
数据输完不会结束,输入非数字数据,程序崩溃。
递归用的可能不熟,诚心请教!
2 回复
#2
rjsp2019-11-12 08:52
程序代码:
#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;
}
#3
三尺冰2019-11-15 12:31
CreateTree函数是递归进行的,每次递归也只是用实参的副本,为什么还是要
使用t的二级指针呢?

1