【发布时间】:2020-01-22 10:04:39
【问题描述】:
我正在尝试基于整数数组创建二叉搜索树。
我创建了一个函数 BST,它接受一个数组及其大小作为参数。现在我在数组的每个项目上调用另一个函数 makeBST ,它采用根节点和那个值。它创建另一个节点并根据该值将其附加到根节点。
但 makeBST 函数并没有在自身上递归并为数组的每个值执行 NULL 条件,即使根节点不为 null
#include<iostream>
#include<cmath>
using namespace std;
class Node {
public:
int data;
Node *left;
Node *right;
};
Node *newNode(int x){
Node *node = new Node();
node->data = x;
node->left=NULL;
node->right = NULL;
return node;
};
void makeBST(Node *node, int x){
if(node==NULL){
// keep getting executed even though root node has a value.
// here must be error.
cout << " NULL condition " << endl;
node = newNode(x);
return;
};
if((node->data) > x){
cout << "also working" << endl;
makeBST(node->left,x);
}else if((node->data) < x){
makeBST(node->right,x);
};
};
Node *BST(int arr[], int n){
Node *root = newNode(arr[0]);
for(int i=1; i<=n-1; i++){
cout << "loop" << i << endl;
makeBST(root,arr[i]);
};
return root;
};
int main(){
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int n=10;
Node *root = BST(arr,n);
return 0;
};
我知道这不是创建二叉搜索树的最佳方式。但我是初学者,这是我能想到的。
谁能帮忙?
【问题讨论】:
-
node = newNode(x);inmakeBST只会泄漏内存。您正在更改node指针变量的 local 值,但在调用站点上看不到该更改。当您使用p == nullptr调用makeBST(p, x)时,之后p仍将是nullptr。尝试使用Node*& node代替makeBST参数。然后确保了解为什么会这样。 -
另外,每个
if (...) { ... }后面的;也不需要。你必须delete你new。 -
除了手头的实际问题,请问您为什么使用像结构这样的类?你的
newNode函数看起来应该是Node的构造函数,而makeBST也感觉像一个方法。 -
@MaxLanghof 你是什么意思?不使用';'是否会删除在 if else 条件下创建的临时空间?我是初学者,所以请原谅我的知识。
-
旁白:例子中你的树也是一个列表,你只分配
Node *rights
标签: c++ algorithm c++11 data-structures