当前位置: 首页 > 知识库问答 >
问题:

更改二叉搜索树的根指针

芮建茗
2023-03-14

我在研究二叉树。我找到了在树中插入节点的代码。这里“root”是类“TreeType”中结构类型的指针变量,作为“private member”。

在这个函数中,“根”是通过引用传递的,所以在“插入”函数中,“树”中的任何变化也会导致“根”的变化。如果我们再次调用插入函数,根将指向最后一个节点还是指向第一个节点?所以,根据我的说法,当它指向最后一个节点时,插入函数将不再工作。有人能帮忙吗?

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.
}

共有2个答案

鄢朝斑
2023-03-14

下面的代码可以更好地说明插入代码,它将问题分解为三种情况:

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子句。然后将创建根指针,由于指针是通过引用传递的,这意味着根节点将在堆上创建并从函数返回。根指针的新值将通过引用传递给调用方。因此根指针值将保留在堆内存中。由于后续树构建正在进行中,所有子节点将在不影响根节点的情况下后续构建。

堵毅然
2023-03-14

根唯一被改变的时间是如果树是空的,那么它仍然会指向“第一个节点”,这就是最初存在的节点。在所有其他情况下,正在更改的“根”是节点的左或右子指针。

 类似资料:
  • 我刚刚学习了如何创建二进制搜索数据结构,它将用于存储字典中的数千个单词。我遇到的问题是,统计添加和删除数据需要很长时间。通常为199263毫秒或200秒,计算100000个单词。有人告诉我,拥有一棵能够自我平衡的树将提高效率,使操作更快。 我的问题是如何使我的树自动平衡以使其高效。我通过消除重复的单词来使树的高度变短,从而做了一些小小的改进。 如果有人能给我一些建议,告诉我如何使树高效,以及如何在

  • 我很难按我教授想要的格式打印出一个二叉搜索树。 他的格式是这样的: 我的代码:

  • 树的特征和定义 树(Tree)是元素的集合。我们先以比较直观的方式介绍树。下面的数据结构是一个树: 树有多个节点(node),用以储存元素。某些节点之间存在一定的关系,用连线表示,连线称为边(edge)。边的上端节点称为父节点,下端称为子节点。树像是一个不断分叉的树根。 每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent)。比如说,3,5是6的子节点,6是3,

  • 我正在学习C++语言,我正在尝试编写BST,但是出了问题。我尝试添加元素到空树,根是NULL,但添加元素后,根仍然是NULL,尽管添加成功了(我在调试模式下看到,节点设置为tmp)。我不知道为什么会这样。

  • 编写一个函数,如果给定的二叉搜索树包含给定的值,则返回1,否则返回0。 例如,对于以下树: N1(值:1,左:null,右:null) n2(值:2,左:n1,右:n3) N3(值:3,左:null,右:null) 对contains(&n2,3)的调用应返回1,因为根位于n2的树包含编号3。 函数应该返回1,然而,它返回0或者根本不返回。

  • 在二元搜索树的情况下,为什么我们不能简单地在一个节点有两个子节点的情况下,将一个节点的前一个节点替换为后一个节点?