二叉树实现C++; 我一直在尝试用C++实现一个二进制搜索树来进行乐趣。我的 问题是我的插入函数有问题。以下是我目前的情况: class TreeNode{ public: int data; TreeNode *left; TreeNode *right; void Insert(int value, TreeNode *x); void TreeNode::Print(TreeNode *x); TreeNode(); }; TreeNode::TreeNode(){ left = NULL; right = NULL; }

二叉树实现C++; 我一直在尝试用C++实现一个二进制搜索树来进行乐趣。我的 问题是我的插入函数有问题。以下是我目前的情况: class TreeNode{ public: int data; TreeNode *left; TreeNode *right; void Insert(int value, TreeNode *x); void TreeNode::Print(TreeNode *x); TreeNode(); }; TreeNode::TreeNode(){ left = NULL; right = NULL; },c++,function,tree,insert,binary-tree,C++,Function,Tree,Insert,Binary Tree,如果希望在左、右子节点均不为null时插入,则可以通过递归移动到树的最左侧节点来插入项。而且,由于您只是以没有特定顺序插入值,因此很难跟踪。而是在这种情况下实现一个二进制搜索树 else if(x->left != NULL && x->right != NULL){ Insert(value,x->left); x-> data = value; x->left = x->right =


如果希望在左、右子节点均不为null时插入,则可以通过递归移动到树的最左侧节点来插入项。而且,由于您只是以没有特定顺序插入值,因此很难跟踪。而是在这种情况下实现一个二进制搜索树

else if(x->left != NULL && x->right != NULL){
         Insert(value,x->left);
         x-> data  = value;
         x->left = x->right = NULL;
}

最重要的是,插入一个基本情况以退出递归。

您不应该盲目插入,请遵循下面的逻辑。如果x.value小于根值,请尝试向左插入。如果x.value大于等于root.value,则转到右侧。重复此逻辑,直到达到空值。这将是插入元素的正确位置

你可以改变逻辑,我只是选择左上。<因为小于等于向左箭头。=) while(根){ 父=根; 根=(根->值>x.value)?根->左:根->右; } 如果(父级->值>x->值) 父->左=x; 其他的 父->右=x; 如果您不关心排序,请使用队列进行深度优先搜索

queue<TreeNode*> nodes;
nodes.push(this);
while(1)
{
    if(!nodes.front()->left)
    {
        nodes.front()->left = x;
        return;
    } 
    else if (!nodes.front()->right)
    {
        nodes.front()->right = x;
        return;
    }
    nodes.push(nodes.front()->left);
    nodes.push(nodes.front()->right);
    nodes.pop();
}
队列节点;
节点。推送(此);
而(1)
{
如果(!nodes.front()->左)
{
nodes.front()->left=x;
返回;
} 
如果(!nodes.front()->right),则为else
{
nodes.front()->right=x;
返回;
}
nodes.push(nodes.front()->left);
nodes.push(nodes.front()->right);
nodes.pop();
}

您到底遇到了什么问题?您是否试图在您的目录树中加入任何组织?看起来您只是将元素放在它们将要去的任何地方,而不是使用数学逻辑为其找到位置。我认为您希望实现二元搜索树。您应该在插入之前编写搜索函数。为了进行插入,您将遵循与搜索非常相似的逻辑来查找节点的正确位置。您走错了方向,除非此插入是add的帮助函数。只有在需要二进制搜索树时才需要此插入。这不是这里的要求。您可以盲目地插入。OP问题的第一行是“我一直试图在C++中实现一个二进制搜索树来进行乐趣”,但是他在代码中张贴的逻辑与他相反。
TreeNode *root = this;
TreeNode *parent = root;
//Traverse the tree, go left if x.val < , else go right(>=)
while(root) {
    parent = root;
    root = (root->value > x.value) ? root->left : root->right;
}
if(parent->value > x->value) 
    parent->left = x;
else
    parent->right = x;
queue<TreeNode*> nodes;
nodes.push(this);
while(1)
{
    if(!nodes.front()->left)
    {
        nodes.front()->left = x;
        return;
    } 
    else if (!nodes.front()->right)
    {
        nodes.front()->right = x;
        return;
    }
    nodes.push(nodes.front()->left);
    nodes.push(nodes.front()->right);
    nodes.pop();
}