在C ++中从排序数组创建BST

时间:2018-03-07 01:23:06

标签: c++ binary-search-tree

您能帮助我理解为什么此代码会随机导致内存访问冲突吗?目标是从排序列表生成二叉搜索树。

单步执行代码我注意到当返回对fromSortedArray()函数的递归调用时#include <iostream> using namespace std; class BST{ private: struct Node { int val; struct Node *left, *right; } *root; public: BST(){ this->root = NULL; } struct Node * fromSortedArray(int data[], int left, int right){ if(left>right) return NULL; int m = left+(right -left)/2; struct Node *node = (struct Node *) malloc(sizeof(struct Node*)); node->val = data[m]; node->left = this->fromSortedArray(data, left, m-1); node->right = this->fromSortedArray(data, m+1, right); return node; } void fromSortedArray(int data[], int n){ this->root = fromSortedArray(data, 0, n-1); } void deleteTree(struct Node *root){ if(root==NULL) return; deleteTree(root->left); deleteTree(root->right); delete root; } void deleteTree(){ this->deleteTree(this->root); } void traverse(struct Node *root){ if(root == NULL) return; if(root->left!=NULL)traverse(root->left); printf("%d ", root->val); if(root->right!=NULL)traverse(root->right); } void traverse(){ this->traverse(this->root); } ~BST(){ deleteTree(); } }; int main(int argc, char * argv[]){ BST tree; int data[] = {2,3,5,6,7,9}; tree.fromSortedArray(data, 6); tree.traverse(); cout << "\n"; return 0; } 指针随机变化的行为。为了给你一个上下文,我正在使用XCODE编译这个应用程序。

spark.udf.register("uuid", ()=>java.util.UUID.randomUUID.toString)

2 个答案:

答案 0 :(得分:2)

我认为这一行是错误的。  struct Node * node =(struct Node *)malloc(sizeof(struct Node *));

应该是   sizeof(struct Node)因为你想为Node而不是Node *

应用内存

答案 1 :(得分:1)

malloc正在malloc。一个人无法合并deletemallocfree必须与new匹配,delete必须与malloc匹配。

避免使用malloc。它可以获得内存字节,仅此而且,您可以轻松地错误计算所需的字节数。 new只应在罕见的边缘情况下用于C ++。更多关于该主题的阅读:enter image description here

使用malloc代替new,如果可能的话,也不要使用std::unique_ptr。改为使用自动变量,库容器或智能指针。

这是一个树结构,并且在这里意见,只要你观察In what cases do I use malloc vs new?你可以使用原始的,愚蠢的指针逃脱,因为它是树结构处理节点管理的工作。也就是说,当你有机会时,请与std::make_uniquestruct Node *node = (struct Node *) malloc(sizeof(struct Node*)); 玩一下。它们可以让您的生活更轻松。

暂时坚持使用原始指针,替换

Node *node = new Node;

{{1}}