#include<iostream>
using namespace std;
/*main idea is to construct ordered statistic tree,which is similar of
binary search tree,width addition of one key,which shows us it's rank in given
tree,for this i introduced additional one key-rank
*/
struct node
{
int val;
node *left,*right;
int rank;
node(int t) { val=t;left=right=NULL;}
};
node *root;
void insert(node *p,int ele)
{
if(p==NULL){
p=new node(ele);
return ;
}
else if(ele<p->val)
{
insert(p->left,ele);
}
else if(ele>p->val)
{
insert(p->right,ele);
}
}
void inorder (node *p)
{
if(p!=NULL){ inorder(p->left);
cout<<p->val<<" "<<p->rank;
inorder(p->right);
}
}
int count_node(node *t)
{
int sum=0;
if(t==NULL) return 0;
else sum=1;
if(t->left) sum+=count_node(t->left);
if(t->right) sum+=count_node(t->right);
return sum;
}
int main()
{
root=NULL;
root->rank=0;
insert(root,26);
insert(root,17);
insert(root,41);
insert(root,14);
insert(root,30);
insert(root,21);
insert(root,47);
insert(root,10);
insert(root,16);
insert(root,28);
insert(root,38);
insert(root,35);
insert(root,39);
insert(root,19);
insert(root,21);
insert(root,20);
insert(root,7);
insert(root,12);
insert(root,3);
inorder(root);
return 0;
}
这段代码导致溢出,但我不明白为什么,因为我已经正确构造了构造函数。
答案 0 :(得分:3)
问题是:
root=NULL;
root->rank=0;
这会导致未定义的行为,因为您取消引用NULL
指针。任何事情都可能发生。
此外:
void insert(node *p,int ele)
{
if(p==NULL){
p=new node(ele);
return ;
}
//...
}
这不会修改原始指针。如果您在insert
指针上调用NULL
,则函数返回时将为NULL
。您需要通过引用传递它:
void insert(node *& p,int ele)
答案 1 :(得分:3)
除了Luchian所说的,你也有这个问题:
void insert(node *p,int ele)
{
if(p==NULL){
p=new node(ele);
return ;
}
....
指针p
按值传递。当您说p=...
时,您正在更改仅对该函数可见的指针副本。您可能需要reference指向您正在更改的指针:
void insert(node *&p, int ele){ ... }
答案 2 :(得分:1)
main
函数的前两行有一个非常大的问题:
root=NULL;
root->rank=0;
如果您查看上面的定义,root
被定义为节点指针,即它不会为实际节点保留任何空间。
如果你没有自己预留空间,那么你试图通过未初始化的内存来写。更重要的是,你明确地说根指向 nothing ,即NULL
。在下一行中,您尝试访问名为rank
的成员。
你应该尝试更换一行:
root = NULL;
使用
root = new node(0);
或类似的实际保留空间并构造节点的东西。
或者,您可以尝试在最后确定根目录的等级,因为如果不存在,insert
函数实际构造了根。 编辑,如Luchian所说,您只需尝试在insert
方法中构建根。如果你按照他建议的方式重新编写insert方法,那么如果只是将root->rank=0;
行移动到插入过程的末尾,那么它可能都会起作用。
答案 3 :(得分:0)
root=NULL;
root->rank=0;
这可能是问题,你不应该尊重NULL
对象。