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

C++ 二叉搜索树。插入方法插入错误,c++,recursion,binary-tree,insertion,non-recursive,C++,Recursion,Binary Tree,Insertion,Non Recursive,我有一个问题,我的项目在我的二叉树被错误地插入。我在每个节点中插入字符串。我想我可能做错了什么,因为我似乎总是以错误的树结束。i、 e A、 B,C 我应该 B / \ A C 但不知怎的,我最终得到了这样的结果: C / \ B A 或者根据我在树中插入的顺序而有所不同 这是我的树类: 这是我的insert方法和insert helper方法。你能看看我做错了什么吗?提前谢谢 void BinarySortTree::insert(string key)

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

A、 B,C

我应该

   B
  /  \
 A    C
但不知怎的,我最终得到了这样的结果:

   C
  / \
 B   A
或者根据我在树中插入的顺序而有所不同

这是我的树类:

这是我的insert方法和insert helper方法。你能看看我做错了什么吗?提前谢谢

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

}
void BinarySortTree::insert(字符串键)
{
if(root!=NULL)
{
插入(键,根);
}
其他的
{
根=新树节点;
根->项=键;
根->左=空;
root->right=NULL;
}
}
void BinarySortTree::insert(字符串键,TreeNode*节点)
{
bool done=false;
而(!完成)
{
if(键比较(节点->项目)<0)
{
如果(节点->左!=NULL)
{
节点=节点->左;
}
其他的
{
节点->左=新树节点;
节点->左->项目=键;
节点->左->左=空;
节点->左->右=空;
完成=正确;
}
}
如果(键比较(节点->项目)>0,则为else
{
如果(节点->右侧!=NULL)
{
节点=节点->右侧;
}
其他的
{
节点->右侧=新树节点;
节点->右侧->项目=键;
节点->右->左=空;
节点->右->右=空;
完成=正确;
}
}
否则如果(键比较(节点->项)==0)
{
完成=正确;
}
}
}

这是因为当您从不更改插入的内容时,例如,如果您首先插入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

您的算法不是递归的,请更正您的问题标签。我建议您重新阅读插入的方式和方法。@Mr.TAMER:您在上面看到的实现肯定不是递归的。至于算法本身。。。事情并不是那么简单。在算法递归的广泛定义下,它可以正式地称为递归。事实上,从算法的角度来看,任何循环都可以解释为递归的退化形式。@AndreyT:谢谢,我不知道。。。经验教训:)我编译了您的代码,您插入这些字母的顺序是什么?我认为您列出的方法没有任何问题。如果按顺序“A、B、C”插入值,则应得到一个非平衡树(如Gajet的答案)。我建议你检查或在这里发布你的其他方法,特别是在Order travel和pretty printing方法中。你正在描述自平衡二进制搜索树。看起来他试图实现一个简单的二叉搜索树而不进行平衡,在你描述的最坏情况下,它会退化为一个线性列表。我需要做什么才能使它平衡?我只需要添加,不需要删除。对于平衡二叉树,您需要例如a或a。不过,实现这些功能有点棘手,您可能首先要解决最初的问题。