请问我用递归实现 前序次序建立一棵二叉树错误在哪里?

发布于 2022-09-06 02:59:23 字数 1601 浏览 19 评论 0

要求:

  1. 按前序次序建立一棵二叉树,以‘#’表示空。
  2. 中序、后序遍历该二叉树,输出遍历序列。
#include<iostream>
using namespace std;

struct BTNode
{
    char data;
    BTNode *leftchild;
    BTNode *rightchild;

    BTNode()
    {
        leftchild = rightchild = NULL;
    }
    BTNode(char a, BTNode *lc, BTNode *rc)
    {
        data = a;
        rightchild = rc;
        leftchild = lc;
    }
};
class BT
{
public:
    BTNode* root;
    BT()
    {
        root = NULL;
    }

    void PreOrderInput(BTNode *p)
    {
        char b;
        cin >> b;

        if (b == '#')
        {
            p = NULL;
        }
        else
        {
            p = new BTNode;
            p->data = b;
            PreOrderInput(p->leftchild);
            PreOrderInput(p->rightchild);
        }
    }
    void InOrderPrint(BTNode *p)
    {
        if (p != NULL)
        {
            InOrderPrint(p->leftchild);
            cout << p->data;
            InOrderPrint(p->rightchild);
        }
        cout << endl;
    }
    void PostOrderPrint(BTNode *p)
    {
        if (p != NULL)
        {
            PostOrderPrint(p->leftchild);
            PostOrderPrint(p->rightchild);
            cout << p->data;
        }
        cout << endl;
    }


};
int main()
{
    BT BT1;
    BT1.PreOrderInput(BT1.root);
    BT1.InOrderPrint(BT1.root);
    BT1.PostOrderPrint(BT1.root);

    return 0;
}

结果不论输入是什么输出都为空
输出BT1.root 发现为空
请问错误在哪里

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

糖粟与秋泊 2022-09-13 02:59:23

猜想是还没有理解函数的形参与实参。

(1) BT1.PreOrderInput(BT1.root);
(2)void PreOrderInput(BTNode *p)
(3)p = new BTNode;
 

(3)中的赋值,只能改p中的值,并不能改BT1.root的值,所以BT1.root还是空的。

参见http://c.biancheng.net/cpp/ht...

实参向形参的数据传递是单向传递,不能由形参再回传给实参。也就是说,实参值传递给形参后,调用结束,形参单元被释放,而实参单元仍保留并且维持原值。

评论说是传的指针,不是传的值。指针,也是一种值。下面代码。ModifyValue就是用指针修改原值,但ModifyValue2,就只是修改指针的值,并未修改指针指向地址的值。

#include<iostream>
void ModifyValue(int * p)
{
    *p = 2;
}
void ModifyValue2(int *p)
{
int v = 2;
p = &v;
}

int main()
{
int a = 1;
 ModifyValue(&a);
std::cout<<a<<std::endl;// print 2

int b = 1;
int * p = &b;
 ModifyValue2(p);
std::cout<<b<<std::endl;// print 1 
    return 0;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文