| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 460 人关注过本帖
标题:二叉树程序有个bug求解决
只看楼主 加入收藏
wangwjt
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2014-11-29
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
二叉树程序有个bug求解决
程序代码:
#include <stdio.h>
#include <stdlib.h>                  //申请内存头文件
#include <conio.h>                   //无回显头文件

#define MAXLEN 20
typedef char DATA;                   //用typedef定义DATA为字符型
typedef struct CBT{
    DATA data;
    struct CBT *left;                //定义左子树结点指针 (递归
    struct CBT *right;               //定义右子树结点指针 (递归
}CBTType;
void TreeNodeData(CBTType *treeNode){
    printf("%c", treeNode->data);
}
CBTType *InitTree(){
    CBTType *node;                                             //定义数据结构为CBTType型的结点指针
    if (node = (CBTType *)malloc(sizeof(CBTType))){            //分配内存
        printf("请输入数据:");
        scanf("%s", &node->data);                              //保存数据
        node->left = NULL;                                     //左子树为空
        node->right = NULL;                                    //右子树为空
        if (node != NULL)return node;                          //进行判断,如果“初始化”成功则返回结点
        else return NULL;
    }
    return NULL;
}
void AddTreeNode(CBTType *treeNode){
    CBTType *pnode;
    CBTType *parent;
    DATA data;
    char menusel;

    if (pnode = (CBTType *)malloc(sizeof(CBTType))){                                 //为结点申请内存
        printf("输入二叉树结点数据:");
        fflush(stdin);                                                      //清空输入缓冲区
        scanf("%s", &pnode->data);
        pnode->left = NULL;                                                 //左子树为空
        pnode->right = NULL;                                                //右子树为空

        printf("请输入父结点数据:");
        fflush(stdin);
        scanf("%s", &data);
        parent = TreeFindNode(treeNode, data);                              //根据数据找结点
        if (!parent){                                                       //如果不存在则释放内存,返回
            printf("未找到该父结点!");
            free(pnode);
            return;
        }
        printf("1.添加该结点到左子树\n2.添加该结点到右子树\n");            //以下是为结点选择父结点的左右子树
        do{                                                                //循环开始
            menusel = getch();                                           //输入1或2给menusel
            menusel -= '0';                                                                                         //有歧义!!!!
            if (menusel == 1 || menusel == 2){                             //在输入1或2给menusel的情况下
                if (parent == NULL)printf("不存在父结点,请先设置父结点"); //先检查,如果存在父结点则进入switch选择
                else {
                    switch (menusel){
                    case 1:
                        if (parent->left)printf("左子树有结点,不为空");
                        else parent->left = pnode;
                        break;
                    case 2:
                        if (parent->right)printf("右子树有结点,不为空");
                        else parent->right = pnode;
                        break;
                    default:
                        ;
                        printf("无效参数!");
                    }
                }
            }
        } while (menusel !=  1 || menusel !=  2);                         //注意执行do……while的循环条件,是menusel的值为1或2

    }
}
CBTType *TreeFindNode(CBTType *treeNode, DATA data){
    CBTType *ptr;                                                           //左右子树递归时用到
    if (treeNode == NULL){                                                  //如果根结点为空,直接return NULL
        return NULL;
    }
    else{
        if (treeNode->data == data)return treeNode;
        else{
            if (ptr = TreeFindNode(treeNode->left, data))return ptr;         //左子树递归查找(本函数赋给新建结点指针)
            else if (ptr = TreeFindNode(treeNode->right, data))return ptr;   //右子树递归查找
            else return NULL;
        }
    }
}
void DLRTree(CBTType *treeNode, void(*TreeNodeData)(CBTType *p)){         //指针函数作形参
    if (treeNode){
        TreeNodeData(treeNode);                                           //显示结点数据
        DLRTree(treeNode->left, TreeNodeData);                            //递归遍历左子树
        DLRTree(treeNode->right, TreeNodeData);                           //递归遍历右子树
    }
}
void LDRTree(CBTType *treeNode, void(*TreeNodeData)(CBTType *p)){
    if (treeNode){
        LDRTree(treeNode->left, TreeNodeData);
        TreeNodeData(treeNode);
        LDRTree(treeNode->right, TreeNodeData);
    }
}
void LRDTree(CBTType *treeNode, void(*TreeNodeData)(CBTType *p)){         //指针函数作形参
    if (treeNode){
        DLRTree(treeNode->left, TreeNodeData);                            //递归遍历左子树
        DLRTree(treeNode->right, TreeNodeData);                           //递归遍历右子树
        TreeNodeData(treeNode);                                           //显示结点数据
    }
}
int TreeDepth(CBTType *treeNode){
    int depleft;                                   //定义左子树深度
    int depright;                                  //定义右子树深度
    if (treeNode == NULL)return 0;                 //如果是空树return 0
    else {
        depleft = TreeDepth(treeNode->left);       //左子树递归
        depright = TreeDepth(treeNode->right);     //右子树递归
        if (depleft > depright)return depleft + 1;  //左右子树深度值比较,输出大的加1
        else return depright + 1;
    }
}
void ClearTree(CBTType *treeNode){
    if (treeNode){
        ClearTree(treeNode->left);                //递归清空左子树
        ClearTree(treeNode->right);               //递归清空右子树
        free(treeNode);                           //释放当前结点所占内存
        treeNode = NULL;
    }
}
void main(){
    CBTType *root = NULL;                        //定义root为指向二叉树根节点指针(root汉译为“跟”)
    char menusel;                                //汉译为“菜单”    用于switch多分支选择
    void(*TreeNodeData1)(CBTType *treeNode);     //指向函数的指针       (无输入参数,返回值为void)
    TreeNodeData1 = TreeNodeData;                //指针指向具体操作的函数      
    root = InitTree();                           //设置根元素

    //添加结点
    do{
        printf("请选择菜单添加二叉树结点");
        printf("0.退出");
        printf("1.添加二叉树结点");
        menusel = getch();
        switch (menusel){
        case '1':AddTreeNode(root);
            break;
        case '0':break;
        default:
            ;
        }
    } while (menusel != '0');
    //遍历-----------
    do{
        printf("请选择菜单遍历二叉树(输入0表示退出):\n");
        printf("1.先序遍历\n");
        printf("2.中序遍历\n");
        printf("3.后序遍历\n");
        menusel = getch();
        switch (menusel){
        case '0':
            break;
        case '1':
            printf("先序遍历结果:");
            DLRTree(root, TreeNodeData1);
            printf("\n");
            break;
        case '2':
            printf("中序遍历结果:");
            LDRTree(root, TreeNodeData1);
            printf("\n");
            break;
        case '3':
            printf("后序遍历结果:");
            LRDTree(root, TreeNodeData1);
            printf("\n");
            break;
        default:
            ;
        }
    } while (menusel != '0');

    //深度---------------------------
    printf("二叉树深度为:%d", TreeDepth(root));
    ClearTree(root);
    root = NULL;
}
搜索更多相关主题的帖子: color 二叉树 
2015-01-29 16:51
wangwjt
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2014-11-29
收藏
得分:0 
错误提示是这么说的“错误error C3861: “TreeFindNode”:  找不到标识符    f:\vc2013\完整源代码\完整源代码\源.cpp    43    1    完整源代码
2015-01-29 16:52
wangwjt
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2014-11-29
收藏
得分:0 
求解决呀,,,,,,
2015-02-01 18:20
lovegh
Rank: 5Rank: 5
来 自:图灵学院
等 级:职业侠客
威 望:3
帖 子:117
专家分:311
注 册:2015-1-23
收藏
得分:10 
叫人家给你找错误,一来你连个错误提示都没贴,自己Debug了么,Debug确定哪段代码有问题了么,确定了在贴出来。谁有空给你调试一段这么长的代码,给你确定错误位置,再告诉你错误原因?

别老是写代码,要多陪妹子,多了解老婆大人,血淋淋的教训。
2015-02-02 00:16
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:10 
不会,还没学过二叉树

一片落叶掉进了回忆的流年。
2015-02-02 00:21
快速回复:二叉树程序有个bug求解决
数据加载中...
 
   



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

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