急救:读取位置时发生访问冲突

evisior 2010-05-27 01:57:42
int BinaryTree::Size(BinTreeNode* &subTree,int &count) //输出二叉树叶子节点的个数以及所有的叶子节点
{
if((subTree -> leftChild == NULL) && (subTree -> rightChild == NULL))
{
cout<<subTree -> data;
count++;
}
Size(subTree -> leftChild,count);
Size(subTree -> rightChild,count);
return count;
};

运行的时候编译器说 “ 0x00411ae8 处最可能的异常: 0xC0000005: 读取位置 0x00000004 时发生访问冲突”为什么

这是为什么呀?

求各位大侠帮忙!!!
...全文
232 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodname 2010-05-27
  • 打赏
  • 举报
回复
(1)

int BinaryTree::Size(BinTreeNode* &subTree,int &count) //输出二叉树叶子节点的个数以及所有的叶子节点
{
if(subTree == NULL) return count;

if((subTree -> leftChild == NULL) && (subTree -> rightChild == NULL))
{
cout<<subTree -> data;
count++;
}
Size(subTree -> leftChild,count);
Size(subTree -> rightChild,count);
return count;
};


(2)

int BinaryTree::Size(BinTreeNode* &subTree,int &count) //输出二叉树叶子节点的个数以及所有的叶子节点
{
if(subTree == NULL) return count;

if((subTree -> leftChild == NULL) && (subTree -> rightChild == NULL))
{
cout<<subTree -> data;
count++;
}
if(subTree -> leftChild != NULL)
Size(subTree -> leftChild,count);
if(subTree -> rightChild!= NULL)
Size(subTree -> rightChild,count);
return count;
};


任选一个,效果都是一样的。


evisior 2010-05-27
  • 打赏
  • 举报
回复
这个是我的整个程序的代码:
#include<iostream>
using namespace std;

struct BinTreeNode
{
char data;
BinTreeNode *leftChild, *rightChild;
BinTreeNode():leftChild(NULL), rightChild(NULL) {}
};

class BinaryTree
{
public:
void CreatBinTree(BinTreeNode* &subTree); //前序遍历建立二叉树
int Height(BinTreeNode* &subTree); //返回树高度
int Size(BinTreeNode* &subTree,int &count); //返回叶子节点数
void preorder(BinTreeNode* &subTree); //前序遍历
void inorder(BinTreeNode* &subTree); //中序遍历
void postorder(BinTreeNode* &subTree); //后序遍历
};


void BinaryTree::CreatBinTree(BinTreeNode* &subTree) //前序遍历建立二叉树
{
char item;
cin >> item;
if(item != '#')
{
subTree = new BinTreeNode(); //建立根节点
subTree -> data = item;
CreatBinTree(subTree -> leftChild); //递归建立左子树
CreatBinTree(subTree -> rightChild); //递归建立右子树
}
};


void BinaryTree::inorder(BinTreeNode* &subTree) //中序次序遍历以subTree为根的子树
{
if(subTree != NULL)
{
if(subTree -> leftChild == NULL)
cout<<'#';
inorder(subTree -> leftChild);
cout<<subTree->data;
if(subTree -> rightChild == NULL)
cout<<'#';
inorder(subTree -> rightChild);
}
};

void BinaryTree::preorder(BinTreeNode* &subTree) //前序次序遍历以subTree为根的子树
{
if(subTree != NULL)
{
cout<< subTree->data;
if(subTree -> leftChild == NULL )
cout<<'#';
preorder(subTree -> leftChild);
if(subTree -> rightChild == NULL)
cout<<'#';
preorder(subTree -> rightChild);
}
};

void BinaryTree::postorder(BinTreeNode* &subTree) //后序遍历以subTree为根的二叉树
{
if(subTree != NULL)
{
if(subTree -> leftChild == NULL)
cout<<'#';
postorder(subTree -> leftChild);
if(subTree -> rightChild == NULL)
cout<<'#';
postorder(subTree -> rightChild);
cout<<subTree->data;
}
};

int BinaryTree::Height(BinTreeNode* &subTree) //计算二叉树的高度或深度
{
if(subTree == NULL)
return 0;
else
{
int i = Height(subTree -> leftChild);
int j = Height(subTree -> rightChild);
return (i < j)?j+1:i+1;
}
};

int BinaryTree::Size(BinTreeNode* &subTree,int &count) //输出二叉树叶子节点的个数以及所有的叶子节点
{
if((subTree -> leftChild == NULL) && (subTree -> rightChild == NULL))
{
cout<<subTree -> data;
count++;
return count;
}
Size(subTree -> leftChild,count);
Size(subTree -> rightChild,count);
return count;
};

int main()
{
int choice,count = 0;
BinaryTree a;
BinTreeNode* subTree = NULL;
cout<<"1、前序递归方式创建二叉树:"<<endl;
cout<<"2、前序遍历输出二叉树:"<<endl;
cout<<"3、中序遍历输出二叉树:"<<endl;
cout<<"4、后序遍历输出二叉树:"<<endl;
cout<<"5、输出二叉树叶子节点的个数及所有的叶子节点:"<<endl;
cout<<"6、输出二叉树的高度:"<<endl;
cout<<"7、输出二叉树的按层次序遍历序列:"<<endl;
cout<<"8、结束程序!"<<endl;
cout<<"请选择操作:"<<endl;
do
{
cin>>choice;
switch(choice)
{
case 1:
cout<<"请输入字符,‘#’表示为空结点:"<<endl;
a.CreatBinTree(subTree);
cout<<"\n请选择下一步操作:"<<endl;
break;
case 2:
cout<<"前序遍历输出二叉树:"<<endl;
a.preorder(subTree);
cout<<"\n请选择下一步操作:"<<endl;
break;
case 3:
cout<<"中序遍历输出二叉树:"<<endl;
a.inorder(subTree);
cout<<"\n请选择下一步操作:"<<endl;
break;
case 4:
cout<<"后序遍历输出二叉树:"<<endl;
a.postorder(subTree);
cout<<"\n请选择下一步操作:"<<endl;
break;
case 5:
cout<<"5、输出二叉树叶子节点的个数及所有的叶子节点:"<<endl;
a.Size(subTree,count);
cout<<"叶子结点个数:";
cout<<count;
cout<<"\n请选择下一步操作:"<<endl;
break;
case 6:
cout<<"6、二叉树的高度为:";
cout<<a.Height(subTree);
cout<<"\n请选择下一步操作:"<<endl;
break;
default:
cout<<"输入错误!"<<endl;
}
}while(choice != 8);
return 0;
}

#include<iostream>
using namespace std;

struct BinTreeNode
{
char data;
BinTreeNode *leftChild, *rightChild;
BinTreeNode():leftChild(NULL), rightChild(NULL) {}
};

class BinaryTree
{
public:
void CreatBinTree(BinTreeNode* &subTree); //前序遍历建立二叉树
int Height(BinTreeNode* &subTree); //返回树高度
int Size(BinTreeNode* &subTree,int &count); //返回叶子节点数
void preorder(BinTreeNode* &subTree); //前序遍历
void inorder(BinTreeNode* &subTree); //中序遍历
void postorder(BinTreeNode* &subTree); //后序遍历
};


void BinaryTree::CreatBinTree(BinTreeNode* &subTree) //前序遍历建立二叉树
{
char item;
cin >> item;
if(item != '#')
{
subTree = new BinTreeNode(); //建立根节点
subTree -> data = item;
CreatBinTree(subTree -> leftChild); //递归建立左子树
CreatBinTree(subTree -> rightChild); //递归建立右子树
}
};


void BinaryTree::inorder(BinTreeNode* &subTree) //中序次序遍历以subTree为根的子树
{
if(subTree != NULL)
{
if(subTree -> leftChild == NULL)
cout<<'#';
inorder(subTree -> leftChild);
cout<<subTree->data;
if(subTree -> rightChild == NULL)
cout<<'#';
inorder(subTree -> rightChild);
}
};

void BinaryTree::preorder(BinTreeNode* &subTree) //前序次序遍历以subTree为根的子树
{
if(subTree != NULL)
{
cout<< subTree->data;
if(subTree -> leftChild == NULL )
cout<<'#';
preorder(subTree -> leftChild);
if(subTree -> rightChild == NULL)
cout<<'#';
preorder(subTree -> rightChild);
}
};

void BinaryTree::postorder(BinTreeNode* &subTree) //后序遍历以subTree为根的二叉树
{
if(subTree != NULL)
{
if(subTree -> leftChild == NULL)
cout<<'#';
postorder(subTree -> leftChild);
if(subTree -> rightChild == NULL)
cout<<'#';
postorder(subTree -> rightChild);
cout<<subTree->data;
}
};

int BinaryTree::Height(BinTreeNode* &subTree) //计算二叉树的高度或深度
{
if(subTree == NULL)
return 0;
else
{
int i = Height(subTree -> leftChild);
int j = Height(subTree -> rightChild);
return (i < j)?j+1:i+1;
}
};

int BinaryTree::Size(BinTreeNode* &subTree,int &count) //输出二叉树叶子节点的个数以及所有的叶子节点
{
if((subTree -> leftChild == NULL) && (subTree -> rightChild == NULL))
{
cout<<subTree -> data;
count++;
return count;
}
Size(subTree -> leftChild,count);
Size(subTree -> rightChild,count);
return count;
};

int main()
{
int choice,count = 0;
BinaryTree a;
BinTreeNode* subTree = NULL;
cout<<"1、前序递归方式创建二叉树:"<<endl;
cout<<"2、前序遍历输出二叉树:"<<endl;
cout<<"3、中序遍历输出二叉树:"<<endl;
cout<<"4、后序遍历输出二叉树:"<<endl;
cout<<"5、输出二叉树叶子节点的个数及所有的叶子节点:"<<endl;
cout<<"6、输出二叉树的高度:"<<endl;
cout<<"7、输出二叉树的按层次序遍历序列:"<<endl;
cout<<"8、结束程序!"<<endl;
cout<<"请选择操作:"<<endl;
do
{
cin>>choice;
switch(choice)
{
case 1:
cout<<"请输入字符,‘#’表示为空结点:"<<endl;
a.CreatBinTree(subTree);
cout<<"\n请选择下一步操作:"<<endl;
break;
case 2:
cout<<"前序遍历输出二叉树:"<<endl;
a.preorder(subTree);
cout<<"\n请选择下一步操作:"<<endl;
break;
case 3:
cout<<"中序遍历输出二叉树:"<<endl;
a.inorder(subTree);
cout<<"\n请选择下一步操作:"<<endl;
break;
case 4:
cout<<"后序遍历输出二叉树:"<<endl;
a.postorder(subTree);
cout<<"\n请选择下一步操作:"<<endl;
break;
case 5:
cout<<"5、输出二叉树叶子节点的个数及所有的叶子节点:"<<endl;
a.Size(subTree,count);
cout<<"叶子结点个数:";
cout<<count;
cout<<"\n请选择下一步操作:"<<endl;
break;
case 6:
cout<<"6、二叉树的高度为:";
cout<<a.Height(subTree);
cout<<"\n请选择下一步操作:"<<endl;
break;
default:
cout<<"输入错误!"<<endl;
}
}while(choice != 8);
return 0;
}





evisior 2010-05-27
  • 打赏
  • 举报
回复
还是不行,改过后的代码

int BinaryTree::Size(BinTreeNode* &subTree,int &count
{
if((subTree -> leftChild == NULL) && (subTree -> rightChild == NULL))
{
cout<<subTree -> data;
count++;
return count;
}
Size(subTree -> leftChild,count);
Size(subTree -> rightChild,count);
};


可是依然会出现那个错误,刚才那个错误我明白了,可是改过之后还是不对!
lirg8405 2010-05-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lirg8405 的回复:]
为NULL了必需返回,要不然会再往上执行,递归出口
[/Quote]
为NULL了必需返回,要不然会再往下执行,递归出口
白云飘飘飘 2010-05-27
  • 打赏
  • 举报
回复
int BinaryTree::Size(BinTreeNode* &subTree,int &count) //输出二叉树叶子节点的个数以及所有的叶子节点
{
if((subTree -> leftChild == NULL) && (subTree -> rightChild == NULL))
{
cout<<subTree -> data;
count++;
return count;
}
Size(subTree -> leftChild,count);
Size(subTree -> rightChild,count);

};
lirg8405 2010-05-27
  • 打赏
  • 举报
回复
为NULL了必需返回,要不然会再往上执行,递归出口
evisior 2010-05-27
  • 打赏
  • 举报
回复
什么意思?没看懂!
lirg8405 2010-05-27
  • 打赏
  • 举报
回复
if((subTree -> leftChild == NULL) && (subTree -> rightChild == NULL))
{
cout<<subTree -> data;
count++;
return count;
}

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧