【问题标题】:Binary Search Tree. Insert method inserting incorrectly二叉搜索树。插入方法插入不正确
【发布时间】:2011-07-14 13:59:15
【问题描述】:

我有一个问题,我的二叉树中的项目插入不正确。我在每个节点中插入字符串。我想我可能做错了什么,因为似乎我总是以错误的树结束。即

A、B、C

我应该有

   B
  /  \
 A    C

但不知何故我最终得到了这样的结果:

   C
  / \
 B   A

或者根据我在树中插入的顺序而有所不同。

这是我的树类:

这是我的插入方法和插入辅助方法。你能看看我做错了什么吗?提前致谢。

void BinarySortTree::insert(string key)
{
    if(root != NULL)
    {
        insert(key, root);
    }
    else
    {
        root = new TreeNode;
        root->item = key;
        root->left = NULL;
        root->right = NULL;
    }
}

void BinarySortTree::insert(string key, TreeNode *node)
{
    bool done = false;

    while(!done)
    {
        if(key.compare(node->item) < 0)
        {
            if(node->left != NULL)
            {
                node = node->left;
            }
            else
            {
                node->left = new TreeNode;
                node->left->item = key;
                node->left->left = NULL;
                node->left->right = NULL;
                done = true;
            }
        }
        else if(key.compare(node->item) > 0)
        {
            if(node->right != NULL)
            {
                node = node->right;
            }
            else
            {
                node->right = new TreeNode;
                node->right->item = key;
                node->right->left = NULL;
                node->right->right = NULL;
                done = true;
            }
        }
        else if(key.compare(node->item) == 0)
        {
            done = true;
        }
    }

}

【问题讨论】:

  • 您的算法不是递归的,请更正您的问题标签。我建议你重新阅读插入的方式和方法。
  • @Mr.TAMER:您在上面看到的实现肯定不是递归的。至于算法本身……没那么简单。在算法递归的广泛定义下,它可以正式称为递归。事实上,从算法的角度来看,任何循环都可以解释为递归的退化形式。
  • @AndreyT:谢谢,我不知道... 经验教训 :)
  • 我编译了你的代码,你到底是按什么顺序插入这些字母的?
  • 我认为您列出的方法没有任何问题。如果您按“A、B、C”的顺序插入值,您应该得到一个非平衡树(如 Gajet 的答案)。我建议您在这里查看或发布您拥有的其他方法,尤其是有序旅行和漂亮的打印方法。

标签: c++ recursion binary-tree insertion non-recursive


【解决方案1】:

这是因为当您从不更改之前插入的内容时,例如,如果您首先插入 C,则您插入的下一个项目(例如 b)永远不会发生在根目录中,所以如果您插入“C”,“B”, “A”按这个顺序你会得到一棵树,形状像:

    C
   /
  B
 /
A

您必须检查每个是否必须更改当前节点!并重新插入您的密钥,因为您的根可能会在每次插入时更改!并且您绘制的树永远不会生成您的代码生成的唯一可能的树形式是这些给定的输入:

 ABC        ACB      BAC        CBA     CAB
                     BCA        
 A          A         B            C       C            
  \          \       / \          /       /      
   B          C     A   C        B       A            
    \        /                  /         \ 
     C      B                  A           B

【讨论】:

  • 您正在描述自平衡二叉搜索树。看起来他正在尝试实现一个没有平衡的简单二叉搜索树,如您所描述的,在最坏的情况下它会退化为线性列表。
  • 我需要做什么才能使其平衡?我只需要添加,不需要删除。
  • 对于平衡二叉树,您需要例如red-black treeAVL tree。不过,实现这些有点棘手,您可能首先要解决最初的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2016-01-17
  • 1970-01-01
相关资源
最近更新 更多