【发布时间】:2020-12-22 09:38:20
【问题描述】:
我编写了一个从向量构造二叉树的代码。问题是当我调用inOrder(root) 时,它会进入无限递归,即root 永远不会变成nullptr。
#include <iostream>
#include <vector>
using namespace std;
class Node {
public:
int data;
Node* left;
Node* right;
explicit Node(int element) {
data = element;
left = nullptr;
right= nullptr;
}
};
Node* construct_tree(Node* root, vector<int> &vec, int i) {
if(i < vec.size()) {
Node* new_node = new Node(vec[i]);
root = new_node;
root->left = construct_tree(root, vec, 2*i + 1);
root->right = construct_tree(root, vec, 2*i + 2);
}
return root;
}
void inOrder(Node* root) {
if (root != nullptr) {
inOrder(root->left);
int n = root->data;
cout << n << " ";
inOrder(root->right);
}
}
int main() {
vector<int> vec{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Node *root = nullptr;
root = construct_tree(root, vec, 0);
cout << root->data << " ";
cout << root->left->data;
inOrder(root);
return 0;
}
可能的修复?
【问题讨论】:
-
正如@MikeCAT 在解决方案中显示的那样,错误在
construct_tree例程中。你在设计函数时犯了一个错误。它递归地构建一棵树并将子树显式分配给当前节点的left和right成员。因此,它应该返回构建的树的根,即new_node(可能是nullptr,如果i太大),而不是通过参数传递的root。
标签: c++ recursion data-structures tree