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

要求:

  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 发现为空
请问错误在哪里

阅读 3.1k
1 个回答

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

(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;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题