chenhy1201 2022-05-10 09:51 采纳率: 100%
浏览 18
已结题

请教一下:这是二叉树的一个实现问题,以下程序我可以运行,但是无论我输入什么都没有输出是为什么

#ifndef tree_H
#define tree_H
#include<iostream>
#include<string>
using namespace std;

template<class T>struct BiNode
{
    T data;
    BiNode<T>* lchild;
    BiNode<T>* rchild;
};

template<class T>class BiTree

{
private:
    void Create(BiNode<T>*& R);//创建二叉树
    void Release(BiNode<T>* R);//释放二叉树
public:
    BiNode<T>* root;//根节点
    BiTree(BiNode<T>* R);//构造函数
    void PreOrder(BiNode<T>* R);//前序遍历
    void InOrder(BiNode<T>* R);//中序遍历
    void PostOrder(BiNode<T>* R);//后序遍历
    void LevelOrder(BiNode<T>* R);//层序遍历
    int TreeDepth(BiNode<T>* R);//二叉树深度
    bool Path(BiNode<T>* R, T S);//指定结点路径
    ~BiTree();//析构函数
};


template<class T>
void BiTree<T>::Create(BiNode<T>*& R)//顺序存储结构为输入创建二叉树,先建立根节点,再建立左右孩子的递归算法
{
    char ch;
    cin >> ch;
    if (ch == '#')
        R = NULL;
    else
    {
        R = new BiNode<T>;
        R->data = ch;
        Create(R->lchild); //建立左孩子
        Create(R->rchild);
    }
}

template<class T>
 void BiTree<T>::Release(BiNode<T>* R)//释放所有结点,左右子树释放完毕后再释放该结点
{
     if (R != NULL)
     {
         Release(R->lchild);
         Release(R->rchild);
         delete R;
     }
}

template<class T>
 BiTree<T>::BiTree(BiNode<T>* R)
{
     Create(root);
}

template<class T>
 void BiTree<T>::PreOrder(BiNode<T>* R)//前序遍历,先访问根结点再访问左右结点
{
     if (R != NULL)
     {
         cout << R->data;
         PreOrder(R->lchild);
         PreOrder(R->rchild);
     }
}

template<class T>
 void BiTree<T>::InOrder(BiNode<T>* R)//中序遍历,先访问左子树,再访问根结点,最后访问右子树
{
     InOrder(R->lchild);
     cout << R->data;
     InOrder(R->rchild);
}

template<class T>
 void BiTree<T>::PostOrder(BiNode<T>* R)//后序遍历,先访问左右结点,再访问根结点
{
     PostOrder(R->lchild);
     PostOrder(R->rchild);
     cout << R->data;
}

template<class T>
 void BiTree<T>::LevelOrder(BiNode<T>* R)//先访问一层的结点,再依次访问左右子树,利用队列来实现
{
     BiNode<T>* queue[100];
     int f = 0, r = 0;
     if (R != NULL)
         queue[++r] = R;//根结点入队
     while(f!=r)
     {
         BiNode<T>* p = queue[++f];
         cout << p->data;//队头元素出队打印
         if (p->lchild != NULL)
             queue[++r] = p->lchild;//左孩子入队
         if (p->rchild != NULL)
             queue[++r] = p->rchild;//右孩子入队
     }
}

template<class T>
 int BiTree<T>::TreeDepth(BiNode<T>* R)//二叉树深度为左右子树 中深度大的加1,利用递归方法
{
     if (R == NULL)
         return 0;
     int ldepth = TreeDepth(R->lchild);//左子树深度
     int rdepth = TreeDepth(R->rchild);//右子树深度
     int depth;
     depth = ldepth > rdepth ? (ldepth + 1) : (rdepth + 1);
     return depth;
}

template<class T>
 bool BiTree<T>::Path(BiNode<T>* R, T S)
{
     if (R == NULL)
         return false;
     else
     {
         if (R->data == S)
         {
             cout << R->data;
             return true;
         }
         else if (Path(R->lchild, S))
         {
             cout << R->data;
             return true;
         }
         else if (Path(R->rchild, S))
         {
             cout << R->rchild;
             return true;
         }
         else
             return false;
     }
}

template<class T>
 BiTree<T>::~BiTree()
{
     Release(root);
}
#endif // !tree_H

#include<iostream>
#include<string>
#include"Bitree.h"
using namespace std;
int main() {
    BiNode<char>* R = NULL;
    char m;
    BiTree<char> Test(R);
    cout << "输出想要路径的结点值:";
    cin >> m;
    cout << "该二叉树的前序遍历为:" << endl;
    Test.PreOrder(Test.root);
    cout << endl;
    cout << "该二叉树的中序遍历为:" << endl;
    Test.InOrder(Test.root);
    cout << endl;
    cout << "该二叉树的后续遍历为:" << endl;
    Test.PostOrder(Test.root);
    cout << endl;
    cout << "该二叉树的层序遍历为:" << endl;
    Test.LevelOrder(Test.root);
    cout << endl;
    cout << "该二叉树的深度为:"; cout << Test.TreeDepth(Test.root);
    cout << endl;
    cout << "从根结点到该结点的路径为:";
    Test.Path(Test.root, m);
    cout << endl;
    Test.~BiTree();
    return 0;
}
  • 写回答

1条回答 默认 最新

  • cdh929511015 2022-05-10 15:42
    关注

    这个是可以输出的, 你可以改为c++版

    
    #include<stdio.h>
    #include<stdlib.h>
    /*定义树的结点结构*/
    
    typedef struct TreeNode {
        char data;/*树中结点的数据是一个字符*/
        struct TreeNode* lchild;
        struct TreeNode* rchild;
    }TREENODE;
    int NodeNum = 0;/*统计数的结点数*/
    int LeafNum = 0;/*统计数的叶子结点数*/
    char ch[] = { 'a', 'b', 'c', ' ', ' ', 'd', ' ', ' ', 'e',  'f', ' ', ' ', 'g', ' ', ' ' };
    int inc = 0;
    /*建立一颗二叉树*/
    int CreateBiTree(TREENODE** T)
    /*按先序次序输入二叉树中结点的值,以空字符表示空树*/
    {
        if (ch[inc++] == ' ')
            *T = NULL;
        else
        {
            printf("%c\n", ch[inc - 1]);
            if (!(*T = (TREENODE*)malloc(sizeof(TREENODE))))
                return -1;
            (*T)->data = ch[inc - 1];
            printf("%c\n", (*T)->data);
            CreateBiTree(&((*T)->lchild));
            CreateBiTree(&((*T)->rchild));
        }
        return 1;
    }
    /*先序遍历二叉树*/
    int PreOderTraverse(TREENODE* T)
    {
        if (T)
        {
            printf("%c  ", T->data);
            PreOderTraverse(T->lchild);
            PreOderTraverse(T->rchild);
        }
        return 1;
    }
    /*  中序遍历二叉树*/
    int InOderTraverse(TREENODE* T)
    {
        if (T)
        {
            InOderTraverse(T->lchild);
            printf("%c  ", T->data);
            InOderTraverse(T->rchild);
        }
        return 1;
    }
    /*  后序遍历二叉树*/
    int BackOderTraverse(TREENODE* T)
    {
        if (T)
        {
            BackOderTraverse(T->lchild);
            BackOderTraverse(T->rchild);
            printf("%c  ", T->data);
        }
        return 1;
    }
    /*利用先序遍历来计算树中的结点数*/
    void CountNodeNum(TREENODE* T)
    {
        if (T)
        {
            NodeNum++;
            CountNodeNum(T->lchild);
            CountNodeNum(T->rchild);
        }
    }
    /*利用先序遍历计算叶子节点数*/
    void CountLeafNum(TREENODE* T)
    {
        if (T)
        {
            if ((!(T->lchild)) && (!(T->rchild)))
                LeafNum++;
            CountLeafNum(T->lchild);
            CountLeafNum(T->rchild);
        }
    }
    int main()
    {
        TREENODE* T;
        int i;
        CreateBiTree(&T);
        do
        {
            puts("**************************************************");
            puts("*          你可以选择:        *");
            puts("*  1:  按预定顺序遍历二叉树 *");
            puts("*  2:  按中序遍历二叉树 *");
            puts("*  3:  通过回溯顺序遍历二叉树 *");
            puts("*  4:  计算二叉树的节点数 *");
            puts("*  5:  计算二叉树的叶子节点数 *");
            puts("**************************************************");
            puts("请输入您的选择:");
            scanf_s("%d", &i);
            switch (i)
            {
            case 1:
                PreOderTraverse(T);
                break;
            case 2:
                InOderTraverse(T);
                break;
            case 3:
                BackOderTraverse(T);
                break;
            case 4:
                CountNodeNum(T);
                printf("节点数: %d", NodeNum);
                break;
            case 5:
                CountLeafNum(T);
                printf("叶子节点数: %d", LeafNum);
                break;
            }
        } while ((i >= 1) && (i < 6));
    
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

    报告相同问题?

    问题事件

    • 系统已结题 5月18日
    • 已采纳回答 5月10日
    • 创建了问题 5月10日

    悬赏问题

    • ¥15 MYSQL 订单的商品明细重复计算问题
    • ¥15 微信实时共享位置修改
    • ¥100 TG的session协议号转成直登号号后客户端登录几分钟后自动退出设备
    • ¥30 共模反馈回路的小信号增益
    • ¥15 arduino ssd1306函数与tone函数放歌代码不兼容问题
    • ¥70 0.96版本hbase的row_key里含有双引号,无法deleteall
    • ¥40 Ida Pro增加插件出现问题
    • ¥15 诊断性META分析合并效能的检验
    • ¥15 请问abb根据色块判断奇偶数并根据批次号放入仓储
    • ¥66 开发PC客户端一定也要开发上位机吗?