【问题标题】:Adding duplicate numbers to a binary search tree将重复数字添加到二叉搜索树
【发布时间】:2022-06-13 18:20:48
【问题描述】:

所以我正在尝试为二叉搜索树创建一个函数,如果您输入一个已经存在的数字,该数字将被添加到左子树,并且左子树被下推一步。

将其可视化

如果我们有一棵看起来像这样的树

        5
      /   \
     3     6
    / \     \
   2   4     9
  /
 1

并在此处插入一个 3,树就变成了

            5
          /   \
         3     6
        /       \
       3         9
      / \
     2   4
    /
   1

但是在我的代码中发生的是重复后的每个数字都被插入两次,这样结果就变成了

                5
              /   \
             3     6
            / \     \
           3   4     9
          /
         2
        /
       2
      /
     1
    /
   1

下面是我目前的代码。

tree *insert(tree *tree, int data){
    if(tree == NULL){
        return new(data);
    }

    if(data > tree->data){
        tree->right = insert(tree->right, data);
    }
    else if(data < tree->data){
        tree->left = insert(tree->left, data);
    }
    else if(data == tree->data){
        if(tree->left == NULL){
            tree->left = insert(tree->left, data);
        }
        else if(tree->left != NULL){
            struct tree *temp = copy(tree->left);

            
            tree->left->data = data;

            tree->left->left = insert(temp, temp->data);
        }
    }

    return tree;
}

感谢您的帮助!

【问题讨论】:

  • 您为什么觉得需要复印?这就是你的问题所在。
  • 在 BST 中,所有键通常被认为是不同的。 (虽然这是一个硬约束,但可能会对遍历的效率产生负面影响)

标签: c binary-tree binary-search-tree


【解决方案1】:

尝试以下版本的插入功能。为了您的方便,我添加了 cmets。希望你能理解。

tree *insert(tree *tree, int data){
    if(tree == NULL){
        return new(data);
    }

    if(data > tree->data){
        tree->right = insert(tree->right, data);
    }
    else if(data < tree->data){
        tree->left = insert(tree->left, data);
    }
    else if(data == tree->data){
        if(tree->left == NULL){
            tree->left = insert(tree->left, data);
        }
        else if(tree->left != NULL){
            struct tree *temp = copy(tree->left);
            struct tree *newNode = new(data); // creating new node with the data
            newNode->left = temp; // newNode's left will point to the copied left tree
            tree->left = newNode; // and tree left will now points to newNode
        }
    }

    return tree;
}

让我知道它是否有效。快乐编码:)

【讨论】:

  • 我刚试了一下,效果很好!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
相关资源
最近更新 更多