二叉搜索树。插入方法插入错误

时间:2011-03-13 19:09:53

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

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

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

}

1 个答案:

答案 0 :(得分:2)

这是因为当你永远不会改变被插入的东西时,例如,如果你首先插入C,你插入的下一个项目(例如b)永远不会发生在root中,所以如果插入“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