C++ 有人看到是什么导致了BST代码中的分段错误吗? #包括 使用名称空间std; #定义是1 #定义0 类树 { 私人: 公众: 结构叶 { int数据; 叶*1; 叶*r; }; 结构叶*p; 树(); ~tree(); 空洞破坏(叶*q); tree(tree&a); void findparent(int n,int&found,leaf*&父项); void findfordel(int n,int&found,leaf*&父,leaf*&x); 无效添加(int n); 空隙横向(); 叶片中的空隙(叶*q); 预空(叶*q); 空柱(叶*q); void del(int n); leaf*createBST(int*preOrder,int*inoorder,int len); }; tree::tree() { p=零; } 树::~tree() { 破坏(p); } 无效树::析构函数(叶*q) { 如果(q!=NULL) { 自毁(q->l); del(q->data); 自毁(q->r); } } void树::findparent(int n,int&found,leaf*&父) { 叶*q; 发现=否; parent=NULL; if(p==NULL) 返回; q=p; while(q!=NULL) { 如果(q->data==n) { 发现=是; 返回; } 如果(q->data>n) { 父母=q; q=q->l; } 其他的 { 父母=q; q=q->r; } } } 无效树::添加(int n) { int-found; 叶*t,*亲本; findparent(n,已找到,父级); 如果(找到==是) coutl=NULL; t->r=NULL; 如果(父项==NULL) p=t; 其他的 父级->数据->n?父级->l=t:父级->r=t; } } void树::横向() { INTC; coutc; 开关(c) { 案例1: in(p); 打破 案例2: pre(p); 打破 案例3: 员额(p); 打破 } } 空树::in(叶*q) { 如果(q!=NULL) { in(q->l); coutr==NULL) { 如果(父->r==x) 父->r=NULL; 其他的 父->l=NULL; 删除x; 返回; } //如果节点只有右叶 如果(x->l==NULL&&x->r!=NULL) { 如果(父->l==x) 父->l=x->r; 其他的 父->r=x->r; 删除x; 返回; } //如果要删除的节点只剩下子节点 如果(x->l!=NULL&&x->r==NULL) { 如果(父->l==x) 父->l=x->l; 其他的 父->r=x->l; 删除x; 返回; } } tree::leaf*tree::createBST(int*preOrder,int*inoorder,int len) { int i; 树::叶*bst=新树::叶; //树bst; if(lendata=*预订单; 对于(i=0;il=createBST(预订单+1,顺序,i); bst->r=createBST(前序+i+1,顺序+i+1,len-i-1); 返回bst; } int main() { /*树t; int data[]={32,16,34,1,87,13,7,18,14,19,23,24,41,5,53}; 对于(int iter=0;iter
,正如Mahesh的注释提示,你的C++ 有人看到是什么导致了BST代码中的分段错误吗? #包括 使用名称空间std; #定义是1 #定义0 类树 { 私人: 公众: 结构叶 { int数据; 叶*1; 叶*r; }; 结构叶*p; 树(); ~tree(); 空洞破坏(叶*q); tree(tree&a); void findparent(int n,int&found,leaf*&父项); void findfordel(int n,int&found,leaf*&父,leaf*&x); 无效添加(int n); 空隙横向(); 叶片中的空隙(叶*q); 预空(叶*q); 空柱(叶*q); void del(int n); leaf*createBST(int*preOrder,int*inoorder,int len); }; tree::tree() { p=零; } 树::~tree() { 破坏(p); } 无效树::析构函数(叶*q) { 如果(q!=NULL) { 自毁(q->l); del(q->data); 自毁(q->r); } } void树::findparent(int n,int&found,leaf*&父) { 叶*q; 发现=否; parent=NULL; if(p==NULL) 返回; q=p; while(q!=NULL) { 如果(q->data==n) { 发现=是; 返回; } 如果(q->data>n) { 父母=q; q=q->l; } 其他的 { 父母=q; q=q->r; } } } 无效树::添加(int n) { int-found; 叶*t,*亲本; findparent(n,已找到,父级); 如果(找到==是) coutl=NULL; t->r=NULL; 如果(父项==NULL) p=t; 其他的 父级->数据->n?父级->l=t:父级->r=t; } } void树::横向() { INTC; coutc; 开关(c) { 案例1: in(p); 打破 案例2: pre(p); 打破 案例3: 员额(p); 打破 } } 空树::in(叶*q) { 如果(q!=NULL) { in(q->l); coutr==NULL) { 如果(父->r==x) 父->r=NULL; 其他的 父->l=NULL; 删除x; 返回; } //如果节点只有右叶 如果(x->l==NULL&&x->r!=NULL) { 如果(父->l==x) 父->l=x->r; 其他的 父->r=x->r; 删除x; 返回; } //如果要删除的节点只剩下子节点 如果(x->l!=NULL&&x->r==NULL) { 如果(父->l==x) 父->l=x->l; 其他的 父->r=x->l; 删除x; 返回; } } tree::leaf*tree::createBST(int*preOrder,int*inoorder,int len) { int i; 树::叶*bst=新树::叶; //树bst; if(lendata=*预订单; 对于(i=0;il=createBST(预订单+1,顺序,i); bst->r=createBST(前序+i+1,顺序+i+1,len-i-1); 返回bst; } int main() { /*树t; int data[]={32,16,34,1,87,13,7,18,14,19,23,24,41,5,53}; 对于(int iter=0;iter,c++,tree,binary-search-tree,C++,Tree,Binary Search Tree,,正如Mahesh的注释提示,你的createBST方法实际上并没有修改你调用它的树对象。因此你的树一开始是空的;它不是通过调用createBST而变为非空的;你对树的遍历没有任何作用,因为你正在遍历一棵空树 #include <iostream> using namespace std; #define YES 1 #define NO 0 class tree { private: public: struct leaf {
createBST
方法实际上并没有修改你调用它的树
对象。因此你的树一开始是空的;它不是通过调用createBST
而变为非空的;你对树的遍历没有任何作用,因为你正在遍历一棵空树
#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 findparent(int n,int &found,leaf* &parent);
void findfordel(int n,int &found,leaf *&parent,leaf* &x);
void add(int n);
void transverse();
void in(leaf *q);
void pre(leaf *q);
void post(leaf *q);
void del(int n);
leaf* createBST(int *preOrder, int* inOrder, int len);
};
tree::tree()
{
p=NULL;
}
tree::~tree()
{
destruct(p);
}
void tree::destruct(leaf *q)
{
if(q!=NULL)
{
destruct(q->l);
del(q->data);
destruct(q->r);
}
}
void tree::findparent(int n,int &found,leaf *&parent)
{
leaf *q;
found=NO;
parent=NULL;
if(p==NULL)
return;
q=p;
while(q!=NULL)
{
if(q->data==n)
{
found=YES;
return;
}
if(q->data>n)
{
parent=q;
q=q->l;
}
else
{
parent=q;
q=q->r;
}
}
}
void tree::add(int n)
{
int found;
leaf *t,*parent;
findparent(n,found,parent);
if(found==YES)
cout<<"\nSuch a Node Exists";
else
{
t=new leaf;
t->data=n;
t->l=NULL;
t->r=NULL;
if(parent==NULL)
p=t;
else
parent->data > n ? parent->l=t : parent->r=t;
}
}
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;
}
}
void tree::findfordel(int n,int &found,leaf *&parent,leaf *&x)
{
leaf *q;
found=0;
parent=NULL;
if(p==NULL)
return;
q=p;
while(q!=NULL)
{
if(q->data==n)
{
found=1;
x=q;
return;
}
if(q->data>n)
{
parent=q;
q=q->l;
}
else
{
parent=q;
q=q->r;
}
}
}
void tree::del(int num)
{
leaf *parent,*x,*xsucc;
int found;
// If EMPTY TREE
if(p==NULL)
{
cout<<"\nTree is Empty";
return;
}
parent=x=NULL;
findfordel(num,found,parent,x);
if(found==0)
{
cout<<"\nNode to be deleted NOT FOUND";
return;
}
// If the node to be deleted has 2 leaves
if(x->l != NULL && x->r != NULL)
{
parent=x;
xsucc=x->r;
while(xsucc->l != NULL)
{
parent=xsucc;
xsucc=xsucc->l;
}
x->data=xsucc->data;
x=xsucc;
}
// if the node to be deleted has no child
if(x->l == NULL && x->r == NULL)
{
if(parent->r == x)
parent->r=NULL;
else
parent->l=NULL;
delete x;
return;
}
// if node has only right leaf
if(x->l == NULL && x->r != NULL )
{
if(parent->l == x)
parent->l=x->r;
else
parent->r=x->r;
delete x;
return;
}
// if node to be deleted has only left child
if(x->l != NULL && x->r == NULL)
{
if(parent->l == x)
parent->l=x->l;
else
parent->r=x->l;
delete x;
return;
}
}
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;
bst->l = createBST(preOrder + 1, inOrder, i);
bst->r = createBST(preOrder + i +1, inOrder + i + 1, len-i-1);
return bst;
}
int main()
{
/* tree t;
int data[]={32,16,34,1,87,13,7,18,14,19,23,24,41,5,53};
for (int iter=0; iter<15; iter++)
{
t.add(data[iter]);
}
t.transverse();
t.del(16);
t.transverse();
t.del(41);
t.tranverse();
*/
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;
}
bst.p
(即l、r、data)的成员没有被分配任何值。但是您正在请求调用in(..)、pre(..)、post(..)中的任何一个成员,从而导致分段错误。您没有收集tree::createBST(…)
在main()中返回的内容所以,你为什么要返回。在20分钟内问两个问题的限制是存在的,因为设计堆栈溢出的人认为你不应该在20分钟内问两个问题。请考虑他们有充分理由的可能性,而不是寻找颠覆系统的方法。tree::createBST
很混乱,它会导致未定义的行为,因为您返回了对局部变量的引用。我在main中更改了代码,并将leaf struct移到了public block。仍然是seg fault这段代码看起来非常熟悉:谢谢,这是一个问题。我已经更改了它,但仍然是seg fault。@Josh-学习使用调试器。
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; // This doesn't come under `if` statement. Nothing gets executed
// after this statement. So, returning a leaf whose members are
// not initialized at all.
// ....
}
bst.p = bst.createBST(pre_data, in_data, 7);