Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不使用动态内存分配的情况下创建基于指针的二叉树? 有些C++程序员说动态内存分配是不好的,应该尽可能避免。我尝试在不使用动态内存分配的情况下创建一个二叉树数据结构,但它不起作用。以下是我尝试过的: struct BTNode { BTNode *left = 0, *right = 0; int data; BTNode(int d_) { data = d_; } void insert(int d_) { BTNode n(d_); if (d_ <= data) if (left == 0) left = &n; else left->insert(d_); else if (right == 0) right = &n; else right->insert(d_); } } struct-BTNode{ BTNode*左=0,*右=0; int数据; BTNode(int d_u2;){data=d_2;;} 空白插入(整数){ btn节点(d_); 如果(d_u)插入(d_u); 其他的 如果(右==0)右=&n; else right->insert(插入); } }_C++_Binary Tree_Dynamic Memory Allocation - Fatal编程技术网

如何在不使用动态内存分配的情况下创建基于指针的二叉树? 有些C++程序员说动态内存分配是不好的,应该尽可能避免。我尝试在不使用动态内存分配的情况下创建一个二叉树数据结构,但它不起作用。以下是我尝试过的: struct BTNode { BTNode *left = 0, *right = 0; int data; BTNode(int d_) { data = d_; } void insert(int d_) { BTNode n(d_); if (d_ <= data) if (left == 0) left = &n; else left->insert(d_); else if (right == 0) right = &n; else right->insert(d_); } } struct-BTNode{ BTNode*左=0,*右=0; int数据; BTNode(int d_u2;){data=d_2;;} 空白插入(整数){ btn节点(d_); 如果(d_u)插入(d_u); 其他的 如果(右==0)右=&n; else right->insert(插入); } }

如何在不使用动态内存分配的情况下创建基于指针的二叉树? 有些C++程序员说动态内存分配是不好的,应该尽可能避免。我尝试在不使用动态内存分配的情况下创建一个二叉树数据结构,但它不起作用。以下是我尝试过的: struct BTNode { BTNode *left = 0, *right = 0; int data; BTNode(int d_) { data = d_; } void insert(int d_) { BTNode n(d_); if (d_ <= data) if (left == 0) left = &n; else left->insert(d_); else if (right == 0) right = &n; else right->insert(d_); } } struct-BTNode{ BTNode*左=0,*右=0; int数据; BTNode(int d_u2;){data=d_2;;} 空白插入(整数){ btn节点(d_); 如果(d_u)插入(d_u); 其他的 如果(右==0)右=&n; else right->insert(插入); } },c++,binary-tree,dynamic-memory-allocation,C++,Binary Tree,Dynamic Memory Allocation,然后主要是这样做 BTNode root(8); root.insert(9); root.insert(10); cout << root.right->right->data; BTNode根节点(8); 根.插入(9); 根。插入(10); 右键->数据; 导致SEGFULT,因为包含数据的BTNode很久以前就超出范围 我的问题是,在不使用new和delete的情况下,如何构建这样一个基于指针的二叉树?简单的回答是:你几乎不能 唯一可能的方法是将整个树置于自动

然后主要是这样做

BTNode root(8);
root.insert(9);
root.insert(10);
cout << root.right->right->data;
BTNode根节点(8);
根.插入(9);
根。插入(10);
右键->数据;
导致SEGFULT,因为包含数据的BTNode很久以前就超出范围


我的问题是,在不使用
new
delete
的情况下,如何构建这样一个基于指针的二叉树?

简单的回答是:你几乎不能

唯一可能的方法是将整个树置于自动或全局范围内,并手动构造:

BTNode root;
BTNode left, right;

root.left=&left;
root.right=&right;
但是,要么当自动作用域离开时,整个事情被破坏,要么你现在有一堆丑陋的全局


只要正确使用,动态范围和动态内存分配没有问题。

您可以将所有节点放在一个
std::array
中。它们可以自由指向彼此。当您释放数组时,所有节点也会安全释放。您只需确保知道y中的哪些元素我们的阵列已经被使用


无论如何,出于教育原因,或者如果您有非常、非常、非常好的理由不使用标准库提供的树和类似容器,请仅实现您自己的树和类似容器。在后一种情况下,尽可能接近标准接口,以启用标准算法、基于范围的循环,并轻松理解其他C++开发人员的可执行代码。

< P>插入方法是在堆栈上分配BtNoad对象,这意味着一旦插入函数返回,对象的内存就无效。 你可以

       BTNode newObj( 9 ) 
       root.insert( newObj );
您还必须将insert方法修改为

       void insert(BTNode &node) { ...
在这种情况下,在您离开主函数之前,newObj对象一直在作用域中。
更好的是,你可以使用静态作用域,这样它在整个程序期间都会存在。

使用值而不是指针你可以创建一个包含足够元素的
BTNode
数组,并将其用作内存池,从数组中提取节点。你可以创建一个
std::vector
来容纳所有节点。我个人不这么认为我只需要做
autonewnode=newbtnode(8)
然后设置适当的指针。建议您避免自己管理
新建
删除
。实际上动态内存分配没有什么问题,不必担心。只需确保使用RAII正确释放内存。我只会尽量避免动态分配在我看来,性能是个大问题,但我很少需要它。