【问题标题】:Binary Tree insertion (in order sorted)二叉树插入(按顺序排序)
【发布时间】:2011-06-22 11:19:06
【问题描述】:

我已在互联网上搜索有关此问题的帮助,但我需要帮助。对于二叉树来说,这不完全是一个普通的插入问题,因为我们不能直接使用树结构本身。我的教授自己写了这个,并给了我们可以用来编写与二叉树有关的函数的函数。因此,我不能使用节点和指针之类的东西。这也是在 C++ 中。

无论如何,这里是我必须编写的递归函数的描述(以及我开始尝试解决这个问题)。请注意,它完全返回一棵新树,实际上并没有向现有树添加任何内容。

tree_t insert_tree(int elt, tree_t tree)
{
    /* 
    // REQUIRES; tree is a sorted binary tree
    // EFFECTS: returns a new tree with elt inserted at a leaf such that 
    //          the resulting tree is also a sorted binary tree.
    //
    //          for example, inserting 1 into the tree:
    //
    //                           4
    //                         /   \
    //                        /      \
    //                       2        5
    //                      / \      / \
    //                         3 
    //                        / \
    //
    // would yield
    //                           4
    //                         /   \
    //                        /      \
    //                       2        5
    //                      / \      / \
    //                     1   3 
    //                    / \ / \
    // 
    // Hint: an in-order traversal of a sorted binary tree is always a
    //       sorted list, and there is only one unique location for
    //       any element to be inserted.
    */

if (elt < elt(tree_left(tree)){
    return insert_tree(tree_left(left));
} else {
    return insert_tree(tree_right(right));
}
}

以下是我们可以使用的功能:

extern bool tree_isEmpty(tree_t tree);
    // EFFECTS: returns true if tree is empty, false otherwise

extern tree_t tree_make();
    // EFFECTS: creates an empty tree.

extern tree_t tree_make(int elt, tree_t left, tree_t right);
    // EFFECTS: creates a new tree, with elt as it's element, left as
    //          its left subtree, and right as its right subtree

extern int tree_elt(tree_t tree);
    // REQUIRES: tree is not empty
    // EFFECTS: returns the element at the top of tree.

extern tree_t tree_left(tree_t tree);
    // REQUIRES: tree is not empty
    // EFFECTS: returns the left subtree of tree

extern tree_t tree_right(tree_t tree);
    // REQUIRES: tree is not empty
    // EFFECTS: returns the right subtree of tree

extern void tree_print(tree_t tree);
    // MODIFIES: cout
    // EFFECTS: prints tree to cout.

【问题讨论】:

  • 我希望我在大学的第一年就知道 stackoverflow。我实际上必须自己解决这个问题。你有什么具体问题吗?您的 start 看起来可能无法编译,因为您没有尝试分别传递给 tree_left 和 tree_right 的 left 或 right 变量。
  • 它不是用来编译的。那正是我的大脑要去的地方。我完全被难住了。我已经在这个项目上工作了好几天,这是我需要编写的最后两个函数之一,所以我的大脑被炸了。我需要朝着正确的方向前进。
  • 这是我见过的最恶心的 API 之一。你的教授声称那是 C++?

标签: c++ recursion tree binary-tree


【解决方案1】:

插入零元素树很容易:

return tree_make(elt, tree_make(), tree_make());

插入单元素树也很容易:

tree_t new_node = tree_make(elt, tree_make(), tree_make());
if(elt < tree_elt(tree))
    return tree_make(tree_elt(tree), new_node, tree_right(tree));
else
    return tree_make(tree_elt(tree), tree_left(tree), new_node);

一般来说,要插入一个新元素,您需要以这种方式重新创建其所有父元素。


第 2 部分:递归

我们有我们的基本情况(零元素树)。而且我们知道如何将新的子树附加到现有树的根部。

那么如何获取新的子树呢?那么,我们将元素插入到当前子树中怎么样?

以下代码将始终将新元素附加到树的最左侧,但是一旦您理解了它就应该很容易纠正:

tree_t tree_insert(int elt, tree_t tree)
{
    if(tree_empty(tree)) //base case
        return tree_make(elt, tree_make(), tree_make());
    else
        return tree_make( // make a new node
            tree_elt(tree) // with the same value as the current one
            tree_insert(elt, tree_left(tree)) //insert into the left subtree
            tree_right(tree) // keep the right subtree the same
            );
}

【讨论】:

  • 嗯,应该在哪里进行递归以找到树的适当部分以插入新的 int?另外,整个树是如何以这种方式重建的?对不起,如果这些都是愚蠢的问题,这个问题对我来说很难,我是一个 n00b。
  • @Slims:我在答案中添加了更多内容 - 这有帮助吗?
  • 现在浏览一下。目前使用我所有的脑力,哈哈,一秒钟(也谢谢你)。
  • 嗯,我明白第 1 部分。我明白为什么它每次都会插入到最左边的位置。我是否需要一个 if 语句来评估 elt 有多大?
  • @Slims:是的,您需要进行某种检查来决定是插入左子树还是右子树。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 2013-02-07
  • 2012-10-21
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
相关资源
最近更新 更多