gpt4 book ai didi

c++ - 使用递归编程的树

转载 作者:行者123 更新时间:2023-11-30 02:39:00 25 4
gpt4 key购买 nike

给定一棵树和一些整数 k,验证右子树的总和是否大于每个子树的(左子树的总和 * k)。

输出应该是一个 vector ,其中包含满足上述条件的树的所有节点的节点值,并按升序排序。

代码如下:

#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;
}

我用 Dr. 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);

关于c++ - 使用递归编程的树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30193241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com