我正在研究二叉树。我发现这个代码用于在树中插入节点。 这里“root”是类“TreeType”中结构类型的指针变量,作为“私有成员”。
在此函数中,“root”通过引用传递,因此在“插入”函数中,“树”中的任何更改也会导致“根”中的更改。如果我们再次调用Insert函数,root将指向最后一个节点,或者它将指向第一个节点?因此,根据我的说法,因为它将指向最后一个节点,insert函数将不再起作用。任何人都可以帮忙吗?
void Insert(TreeNode*& tree, ItemType item);
void TreeType::InsertItem(ItemType item)
// Calls the recursive function Insert to insert item into tree.
{
Insert(root, item);
}
void Insert(TreeNode*& tree, ItemType item)
// Inserts item into tree.
// Post: item is in tree; search property is maintained.
{
if (tree == NULL)
{// Insertion place found.
tree = new TreeNode;
tree->right = NULL;
tree->left = NULL;
tree->info = item;
}
else if (item < tree->info)
Insert(tree->left, item); // Insert in left subtree.
else
Insert(tree->right, item); // Insert in right subtree.
}
答案 0 :(得分:1)
root唯一被更改的时间是树是否为空,所以它仍然指向“第一个节点”就是这样存在于第一位。在所有其他情况下,正在更改的“根”是节点的左子指针或右子指针。
答案 1 :(得分:1)
以下代码可以更好地说明插入代码,该代码将问题分解为三种情况:
void Insert(TreeNode*& tree, ItemType item)
{
if (tree == NULL)
{
// Insertion place found.
tree = new TreeNode;
tree->right = NULL;
tree->left = NULL;
tree->info = item;
return;
}
if (item < tree->info) {
if(tree->left == NULL) {
tree->left = new TreeNode;
} else {
Insert(tree->left, item); // Insert in left subtree.
}
} else {
if(tree->right == NULL) {
tree->right = new TreeNode;
} else {
Insert(tree->right, item); // Insert in right subtree.
}
}
}
如您所见,当树空时,root=NULL
。所以它第一次进入第一个if
子句。然后将创建根,并且由于指针是通过引用传入的,这意味着将在堆上创建根节点并从函数返回。根指针的新值将通过引用传递给调用者。因此,根指针值将保留在堆内存中。随后的树构建正在进行中,随后将构建所有子节点,而不会影响根节点。