【问题标题】:Weird error in binary search tree [closed]二叉搜索树中的奇怪错误[关闭]
【发布时间】:2011-03-20 22:47:01
【问题描述】:
#include <iostream>
using namespace std;
#define YES 1
#define NO 0

class tree
{
    private:

    public:
        struct leaf
        {
            int data;
            leaf *l;
            leaf *r;
        };
        struct leaf *p;
        tree();
        ~tree();
        void destruct(leaf *q);
        tree(tree& a);
        void add(int n);
        void transverse();
        void in(leaf *q);
        void pre(leaf *q);
        void post(leaf *q);
        leaf*  createBST(int *preOrder, int* inOrder, int len);     
};      
tree::tree()
{
    p=NULL;
}
tree::~tree()
{
    destruct(p);
}
void tree::destruct(leaf *q)
{

}

void tree::transverse()
{
    int c;
    cout<<"\n1.InOrder\n2.Preorder\n3.Postorder\nChoice: ";
    cin>>c;
    switch(c)
    {
        case 1:
            in(p);
            break;

        case 2:
            pre(p);
            break;

        case 3:
            post(p);
            break;
    }
}
void tree::in(leaf *q)
{
    if(q!=NULL)
    {
        in(q->l);
        cout<<"\t"<<q->data<<endl;
        in(q->r);
    }

}
void tree::pre(leaf *q)
{
    if(q!=NULL)
    {
        cout<<"\t"<<q->data<<endl;
        pre(q->l);
        pre(q->r);
    }

}
void tree::post(leaf *q)
{
    if(q!=NULL)
    {
        post(q->l);
        post(q->r);
        cout<<"\t"<<q->data<<endl;
    }

}



tree::leaf* tree::createBST(int *preOrder, int* inOrder, int len)
{
    int i;
    tree::leaf *bst = new tree::leaf;
//  tree bst;
//  if(len < 0)
//      {//bst = NULL;
//      return bst;}

    bst->data = *preOrder;
    for(i = 0; i < len; i++)
        if(*(inOrder + i) == *preOrder)
        break;
    if(i>=0)    
        bst->l = createBST(preOrder + 1, inOrder, i);
    if((len-i-1) >=0)
        bst->r = createBST(preOrder + i +1, inOrder + i + 1, len-i-1);
    return bst;

}

int main()
{


    tree bst;
    int pre_data[] = {20,8,4,12,10,14,22};
    int in_data[] = {4,8,10,12,14,20,22};
    bst.p = bst.createBST(pre_data, in_data, 7);
    bst.transverse();

    return 0;
}

主要问题在功能上

  tree::leaf* tree::createBST(int *preOrder, int* inOrder, int len)

注意:我已经发布了两个关于此的问题。因为我修改了很多代码,所以我开始了一个新的帖子。

【问题讨论】:

  • 在英文中,'transverse'的意思是'across'或'cross-wise';你可能应该使用'bst.traverse()`。
  • @sth , 编译时分段错误
  • @user:哪个编译器?你怎么知道问题出在你提到的函数上?
  • 您应该说明您要解决什么问题,您的预期解决方案是什么以及您的代码中似乎有什么问题。如果您遇到编译器错误或程序出现意外结果、不良行为...
  • -1 同一个问题的第三个问题。

标签: c++ tree binary-search-tree


【解决方案1】:

我认为错误在于您的递归没有终止条件。考虑len == 0的情况,你会执行这行代码:

bst->l = createBST(preOrder + 1, inOrder, i);

这将传入长度为 0 的内容,同样的事情将再次发生。这是无限递归,会导致分段错误。

我认为您的问题可以通过将其添加到 createBST 的开头来解决:

if(len == 0)
    return NULL;

【讨论】:

  • 谢谢 JaredC。确切地。你节省了我的时间。感谢你。问题解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多