【发布时间】:2020-08-27 20:02:28
【问题描述】:
在解决问题时,我尝试了以下解决方案。不知何故,我的输出陷入了无限循环,没有打印结果或更新的堆树。
给定一棵树,其中左右子树都是最小堆,但根节点不保持最小堆属性。您的代码应修改以 Node* n 为根的树,使其成为最小堆。 (这意味着您需要满足最小堆属性: 一个节点的值可以等于它的一个或两个子节点是可以的,但该节点的值不能大于它的任何一个子节点。您不必尝试平衡树或使其成为完整的树。)
#include <iostream>
#include <string>
You have the following class Node already defined.
You cannot change this class definition, so it is
shown here in a comment for your reference only:
class Node {
public:
int value;
Node *left, *right;
Node(int val = 0) { value = val; left = right = nullptr; }
~Node() {
delete left;
left = nullptr;
delete right;
right = nullptr;
}
};
This function has also previously been defined for you:
void printTreeVertical(const Node* n);
You can use it to print a verbose, vertical diagram of
a tree rooted at n. In this vertical format, a left child
is shown above a right child in the same column. If no
child exists, [null] is displayed.
*/
void downHeap(Node *n) {
Node *curr = new Node();
Node *mino = new Node();
if (n == nullptr ){
return;
} else if (n->left->value > n->value & n->right->value > n->value){
return;
// } else if (n->left== nullptr & n->right== nullptr) {
// return;
// }
} else {
// node* curr = new Node(n)
// n = new Node((std::min(n->left->value, n->right->value));
// if (n->left->value)
while(n->left!= nullptr & n->right!= nullptr){
if (n->left == nullptr){
mino = n->right;
} else if (n->right == nullptr) {
mino = n->left;
} else {
mino = (std::min(n->left, n->right));
}
std::cout << n->value << std::endl;
std::cout << mino->value << std::endl;
if(n->value > mino-> value){
curr->value = n->value;
n->value = mino->value;
mino->value = curr->value;
std::cout << n->value << std::endl;
std::cout << mino->value << std::endl;
downHeap(mino);
}
}
return;
}
}
// Implement downHeap() here.
// You can also use this compact printing function for debugging.
void printTree(Node *n) {
if (!n) return;
std::cout << n->value << "(";
printTree(n->left);
std::cout << ")(";
printTree(n->right);
std::cout << ")";
}
int main() {
Node *n = new Node(100);
n->left = new Node(1);
n->left->left = new Node(3);
n->right = new Node(2);
n->right->left = new Node(3);
n->right->right = new Node(4);
n->right->right->right = new Node(5);
std::cout << std::endl << "BEFORE - Vertical printout:" << std::endl;
printTreeVertical(n);
downHeap(n);
std::cout << "Compact printout:" << std::endl;
printTree(n);
std::cout << std::endl << " AFTER Vertical printout:" << std::endl;
printTreeVertical(n);
delete n;
n = nullptr;
return 0;
}
请建议我缺少什么。我觉得我把它弄得太复杂了。另外,我没有任何其他功能,例如将二叉树转换为堆最小值的交换。我也没有使用数组或向量。所以,如果你能给我提供简单的解决方案,我将不胜感激。
【问题讨论】:
-
在调试器中加载您的程序,然后单步执行。这将准确地向您显示事情在哪里偏离了轨道。如果您不知道如何使用调试器,那么现在是学习的最佳时机。
-
mino = (std::min(n->left, n->right));可能是一个错误。我想你想要n->left->value和n->right->value。此外,在(n->left== nullptr & n->right== nullptr)中,您可能需要&&。同样的事情在上面几行。最后,编辑您的问题以修复缩进。我认为问题在于您在downHeap中的return在while正文之外,这可能会导致无限循环。 -
@JimMischel 我想返回 mino 作为 root 左右子节点中最小的节点。如果我使用 -> value,它将只返回整数和注释节点。请纠正我或让我知道更好的方法。
-
我看到了问题。您真正想要的是具有最小值的节点。
std::min无法做到这一点。您需要比较这些值并返回节点。if (node->left->value < node->right->value) return node->left; else return node->right; -
@JimMischel 谢谢。确切地。这就是问题所在。它像魅力一样固定。
标签: c++ recursion data-structures binary-tree heap