使用递归编程的树
Tree using recursive programming
给定一个树和一些整数k,请验证每个子树的右子树的总和是否大于(左子树 * k的总和)。
输出应为载体,其中包含在上述条件为真的树的所有节点的节点值,按升序排序。
这是代码:
#include <iostream>
#include <cstdlib>
#include <vector>
#include <algorithm>
using namespace std;
struct node{
int info;
node* right;
node* left;
};
int sommatuttechiavi(node*& tree){
if (tree == nullptr){
return 0;
}
else{
return tree->info + sommatuttechiavi(tree->left) + sommatuttechiavi(tree->right);
}
}
int sommachiavidestra(node*& tree){
if (tree == nullptr){
return 0;
}
tree = tree->right;
return sommatuttechiavi(tree);
}
int sommachiavisinistra(node*& tree){
if (tree == nullptr){
return 0;
}
tree = tree->left;
return sommatuttechiavi(tree);
}
void insert(node*& tree, int info){
if (tree==nullptr){
tree = new node;
tree->info = info;
tree->left = nullptr;
tree->right = nullptr;
}
else{
if (tree->info > info){
insert(tree->left, info);
}
else{
insert(tree->right, info);
}
}
return;
}
void checkpropety(node*& tree, vector<int>& isok, int k){
if (tree==nullptr){
return;
}
else{
if ((sommachiavisinistra(tree)*k) < sommachiavidestra(tree)){
isok.push_back(tree->info);
}
checkpropety(tree->left, isok, k);
checkpropety(tree->right, isok, k);
return;
}
}
bool ordina(const int& asd, const int& dsa){
if (asd < dsa){
return true;
}
else{
return false;
}
}
int main(){
vector<int> resultset;
node* root = nullptr;
int n, k;
cin >> n;
cin >> k;
for (int i = 0; i < n; i++){
int t;
cin >> t;
insert(root, t);
}
checkpropety(root, resultset, k);
sort(resultset.begin(), resultset.end(), ordina);
for (unsigned i = 0; i < resultset.size(); i++){
if (i == resultset.size() - 1){
cout << resultset[i];
}else{
cout << resultset[i] << ' ';
}
}
return 0;
}
我用Memory博士进行了几次测试,它检测到了此错误:
Error #1: UNADDRESSABLE ACCESS: reading 0x00000008-0x0000000c 4 byte(s)
# 0 checkpropety [{a lot of directory}test_esame2.cpp:51]
# 1 checkpropety [{a lot of directory}test_esame2.cpp:58]
# 2 main [{a lot of directory}test_esame2.cpp:82]
我整天都检查了此功能。有人能帮我吗??预先感谢,对不起,我的英语不好。
您可能不想将tree
作为sommachiavisinistra
和sommachiavidestra
的引用,因为这还将修改呼叫者的tree
版本。在checkpropety
中,似乎到您到达checkpropety(tree->left, isok, k)
递归电话时,tree
已经是nullptr
。
侧面注意:ordina
应该只采用int
参数,而不是const int&
。它可以缩短为一行:return (asd < dsa);
您的求和功能正在改变树:
int sommachiavidestra(node*& tree){
if (tree == nullptr){
return 0;
}
tree = tree->right;
return sommatuttechiavi(tree);
}
将把参数设置为自己的右子树。
由于您在选中"属性"时重复出现,因此您将达到(sommachiavisinistra(tree)*k) < sommachiavidestra(tree)
之后,tree
为null,并且您将获得无效的读取。
而是这样做:
int sommachiavidestra(const node* tree){
if (tree == nullptr){
return 0;
}
return sommatuttechiavi(tree->right);
}
和类似的左子树。
sommatuttechiavi
或checkPropety
也没有理由进行参考参数。
相关文章:
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 递归列出所有目录中的C++与Python与Ruby的性能
- 返回不停止函数,递归函数问题?(编程练习,动态规划,Levenshtein 回溯)
- 如何使用 Boost Hana 删除元编程递归
- 使用元编程递归初始化 std::array
- 递归模板参数包编程
- 使用递归编程布尔计划
- 双递归动态编程
- 使用递归编程的树
- 模板元编程递归上限
- 元编程和SFINAE/std::enable_if:无限模板递归
- C++元编程递归步长限制
- 递归解决方案的动态编程解决方案
- 模板元编程:原始递归
- 如何在c++中编写元编程模板的最后递归
- 在TBB中使用递归、基于任务的并行编程获得不同的输出
- 形成递归函数C++编程
- 模板元编程的尾递归性能