#include <iostream>
using namespace std;
struct BiNode
{
int data;
BiNode *lchild,*rchild;
};
class BiSortTree
{
public:
BiSortTree(int a[],int n); //建立查找集合a[n]的二叉排序树
~BiSortTree(){} //释放二叉排序树中所有结点
void InsertBST(BiNode *root,BiNode *s); //在二叉排序树中插入一个结点s
BiNode* SearchBST(BiNode *root,int k); //查找值为k的结点
void Print();
private:
BiNode *root; //二叉排序树的根指针
};
BiSortTree::BiSortTree(int a[],int n)
{
root=NULL;
BiNode *s;
for(int i=0;i<n;i++)
{
s=new BiNode;
s->data=a[i];
s->lchild=s->rchild=NULL;
InsertBST(root,s);
delete s;
}
}
void BiSortTree::InsertBST(BiNode *root,BiNode *s)
{
if(root==NULL) root=s;
else if(s->data<root->data) InsertBST(root->lchild,s);
else InsertBST(root->rchild,s);
}
BiNode* BiSortTree::SearchBST(BiNode *root,int k)
{
if(root==NULL) return NULL;
else if(root->data==k) return root;
else if(k<root->data) return SearchBST(root->lchild,k);
else return SearchBST(root->rchild,k);
}
void BiSortTree::Print()
{
cout<<root->data<<endl;
}
int main()
{
cout<<"输入创建的二叉排序树的结点个数:";
int num;
cin>>num;
int *a=new int[num];
cout<<"输入各个结点上的数据:"<<endl;
for(int i=0;i<num;i++)
cin>>a[i];
BiSortTree bisort(a,num);
cout<<"二叉排序树上各点的数据如下:"<<endl;
bisort.Print();
return 0;
}
上面代码中Print函数是我加上看能不能输出的,但是运行到Print函数的时候出现内存不能读。是不是没给root指针new分配一块内存啊?我定义的结构体s指针在InsertBST给root复制的操作对不对啊?还有析构函数该怎么写呢?这么感觉挺别扭的。。。
11 个解决方案
#1
BiSortTree::BiSortTree(int a[],int n)
{
root=NULL;
BiNode *s;
for(int i=0;i <n;i++)
{
s=new BiNode;
s->data=a[i];
s->lchild=s->rchild=NULL;
InsertBST(root,s);
delete s; //你都delete了再printf肯定不能read了、、这句注释掉
}
}
{
root=NULL;
BiNode *s;
for(int i=0;i <n;i++)
{
s=new BiNode;
s->data=a[i];
s->lchild=s->rchild=NULL;
InsertBST(root,s);
delete s; //你都delete了再printf肯定不能read了、、这句注释掉
}
}
#2
删掉BiSortTree::BiSortTree(int a[],int n)构造里的delete s;
在~BiSortTree()析构里对二叉排序树的节点进行delete.
在~BiSortTree()析构里对二叉排序树的节点进行delete.
#3
s指针是临时的,只是用来复制非给root的,上次问过了,s应该先释放掉才可以重新new的,问题是如何给每个结点new分配空间呢?我试了很多都不对!!!
#4
我的主要问题就是不知道在这种情况下,就是用临时的s结构体指针复制给每个结点的情况下,如何给每个结点分配内存。。。应该怎么做才对呢?
#5
s=new BiNode;
s->data=a[i];
s->lchild=s->rchild=NULL;
InsertBST(root,s);
这不就是给每个节点new空间么。。new了然后insert到root中
析构函数中再释放这些空间。。你直接delete掉s。。相当于这段代码直接都没执行
#6
你这里s只是指针,或者你给node写个=的重载,对*s进行操作后释放。现在这样没问题,不需要释放。
#7
对s指针new空间后赋给某个结点,是不是该结点也相应有了一块空间?应该不是吧?而且输出的时候应该是root的递归吧,这样的话结点还是没有new空间啊?还有,重复给一个指针new空间可以吗?好像应该先释放掉才可以吧?
#8
但是我想通过root指针递归访问每个结点啊,每个结点并没有new空间啊,只是用new过空间的s指针给结点赋值,正确做法应该怎么做呢?
#9
void V(bTree *root)
{
if(root!=root)
{
printf("%d ",root->data);
V(root->lchild);
V(root->rchild);
}
}
{
if(root!=root)
{
printf("%d ",root->data);
V(root->lchild);
V(root->rchild);
}
}
#10
我知道应该这样做,问题是程序读取不了root->data,会显示内存不能读,我上面代码中还没为每个结点new空间呢,但就是不知该如何new??
#11
问题已经解决了,我自己改了如下就可以了,谢谢大家啦!
void BiSortTree::InsertBST(BiNode *&root,BiNode *s)
{
if(root==NULL)
{
root=new BiNode;
*root=*s;
}
else if(s->data<root->data)
InsertBST(root->lchild,s);
else
InsertBST(root->rchild,s);
}
void BiSortTree::InsertBST(BiNode *&root,BiNode *s)
{
if(root==NULL)
{
root=new BiNode;
*root=*s;
}
else if(s->data<root->data)
InsertBST(root->lchild,s);
else
InsertBST(root->rchild,s);
}
#1
BiSortTree::BiSortTree(int a[],int n)
{
root=NULL;
BiNode *s;
for(int i=0;i <n;i++)
{
s=new BiNode;
s->data=a[i];
s->lchild=s->rchild=NULL;
InsertBST(root,s);
delete s; //你都delete了再printf肯定不能read了、、这句注释掉
}
}
{
root=NULL;
BiNode *s;
for(int i=0;i <n;i++)
{
s=new BiNode;
s->data=a[i];
s->lchild=s->rchild=NULL;
InsertBST(root,s);
delete s; //你都delete了再printf肯定不能read了、、这句注释掉
}
}
#2
删掉BiSortTree::BiSortTree(int a[],int n)构造里的delete s;
在~BiSortTree()析构里对二叉排序树的节点进行delete.
在~BiSortTree()析构里对二叉排序树的节点进行delete.
#3
s指针是临时的,只是用来复制非给root的,上次问过了,s应该先释放掉才可以重新new的,问题是如何给每个结点new分配空间呢?我试了很多都不对!!!
#4
我的主要问题就是不知道在这种情况下,就是用临时的s结构体指针复制给每个结点的情况下,如何给每个结点分配内存。。。应该怎么做才对呢?
#5
s=new BiNode;
s->data=a[i];
s->lchild=s->rchild=NULL;
InsertBST(root,s);
这不就是给每个节点new空间么。。new了然后insert到root中
析构函数中再释放这些空间。。你直接delete掉s。。相当于这段代码直接都没执行
#6
你这里s只是指针,或者你给node写个=的重载,对*s进行操作后释放。现在这样没问题,不需要释放。
#7
对s指针new空间后赋给某个结点,是不是该结点也相应有了一块空间?应该不是吧?而且输出的时候应该是root的递归吧,这样的话结点还是没有new空间啊?还有,重复给一个指针new空间可以吗?好像应该先释放掉才可以吧?
#8
但是我想通过root指针递归访问每个结点啊,每个结点并没有new空间啊,只是用new过空间的s指针给结点赋值,正确做法应该怎么做呢?
#9
void V(bTree *root)
{
if(root!=root)
{
printf("%d ",root->data);
V(root->lchild);
V(root->rchild);
}
}
{
if(root!=root)
{
printf("%d ",root->data);
V(root->lchild);
V(root->rchild);
}
}
#10
我知道应该这样做,问题是程序读取不了root->data,会显示内存不能读,我上面代码中还没为每个结点new空间呢,但就是不知该如何new??
#11
问题已经解决了,我自己改了如下就可以了,谢谢大家啦!
void BiSortTree::InsertBST(BiNode *&root,BiNode *s)
{
if(root==NULL)
{
root=new BiNode;
*root=*s;
}
else if(s->data<root->data)
InsertBST(root->lchild,s);
else
InsertBST(root->rchild,s);
}
void BiSortTree::InsertBST(BiNode *&root,BiNode *s)
{
if(root==NULL)
{
root=new BiNode;
*root=*s;
}
else if(s->data<root->data)
InsertBST(root->lchild,s);
else
InsertBST(root->rchild,s);
}