以下是删除C中的树(由GeeksforGeeks提供)
#include<stdio.h>
#include<stdlib.h>
/* A binary tree node has data, pointer to left child
and a pointer to right child */
struct node
{
int data;
struct node* left;
struct node* right;
};
/* Helper function that allocates a new node with the
given data and NULL left and right pointers. */
struct node* newNode(int data)
{
struct node* node = (struct node*)
malloc(sizeof(struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
return(node);
}
/* This function traverses tree in post order to
to delete each and every node of the tree */
void deleteTree(struct node* node)
{
if (node == NULL) return;
/* first delete both subtrees */
deleteTree(node->left);
deleteTree(node->right);
/* then delete the node */
printf("\n Deleting node: %d", node->data);
free(node);
}
/* Driver program to test deleteTree function*/
int main()
{
struct node *root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
deleteTree(root);
root = NULL;
printf("\n Tree deleted ");
getchar();
return 0;
}
The above deleteTree() function deletes the tree, but doesn’t change root to NULL which may cause problems if the user of deleteTree() doesn’t change root to NULL and tires to access values using root pointer. We can modify the deleteTree() function to take reference to the root node so that this problem doesn’t occur. See the following code.
#include<stdio.h>
#include<stdlib.h>
/* A binary tree node has data, pointer to left child
and a pointer to right child */
struct node
{
int data;
struct node* left;
struct node* right;
};
/* Helper function that allocates a new node with the
given data and NULL left and right pointers. */
struct node* newNode(int data)
{
struct node* node = (struct node*)
malloc(sizeof(struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
return(node);
}
可以通过free(node)
删除C中的节点。在Python中,没有这样的方法。我是否需要引用节点的父节点来删除Python中的节点,而我在C中不需要节点?
(即有没有办法在Python中使用delete(node)
代替parent.left = None
?
澄清: 我会删除Python中的一个树(可能有一些错误)。
def delete_tree(root, parent):
if not root:
return
if not root.left and not root.right:
if root is parent.left:
parent.left = None
else:
parent.right = None
delete_tree(root.left, root)
delete_tree(root.right, root)
root = None
在提供的C代码中,可以通过释放特定节点的已分配内存来删除节点。但是,在Python中,我需要引用节点的父节点来删除节点。是否有比我的代码更简单的方法从树中删除特定节点?
答案 0 :(得分:4)
正如评论中所解释的那样,Python中没有必要这样做。但是,如果您希望Python代码“像C代码一样”,请转到:
class Node:
# with data members .data, .left, and .right
def __init__(self, data):
self.data = data
self.left = self.right = None
def deleteTree(node):
if node is not None:
deleteTree(node.left)
deleteTree(node.right)
node.left = node.right = None
在Python中拼写“释放此内存”是不可能的。所有你能做的 - 你需要做的就是停止引用你不再关心的对象。
编辑:而且,我应该补充一下,你最终会认为这是一个好的事情:当你知道你永远不会看到NULL
指针时,生活会变得更加愉快再次解除引用段错误;-)这就是“为什么”Python没有办法拼出“释放这段记忆”。
答案 1 :(得分:2)
我认为你对C和Python内存管理的差异有一点误解。在C语言中,您需要删除之前从堆中取出的所有未使用的内存。您可以通过调用free
函数来执行此操作
Python使用garbage collection进行自动内存管理。所以,通过执行parent.left = None
,你告诉:对这个对象的引用将是None
,没有其他人知道对这个对象的引用,我们可以收集它。垃圾收集器处理其他所有内容,因此您不需要从堆中显式删除此对象。
是否有比我的代码更简单的方法从树中删除特定节点?
您没有从树中删除特定节点,而是删除树本身。您可以更轻松地在Python中执行此操作 - 只需将其根目录的引用设置为None
,垃圾收集器将关注树。
答案 2 :(得分:0)
我想你要找的是:
node ##class '__main__.node'
del(node)
node
Traceback (most recent call last):
NameError: name 'node' is not defined