如何在不使用动态内存分配的情况下创建基于指针的二叉树? 有些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正确释放内存。我只会尽量避免动态分配在我看来,性能是个大问题,但我很少需要它。