当前位置: 首页 > 知识库问答 >
问题:

预排序二进制搜索树插入

洪开济
2023-03-14

一个痛苦而愚蠢的问题,我几乎羞于不敢问。在过去的4个小时里,我一直在寻找,测试了不同的算法,在纸上尝试了不少,但仍然无法正常工作。

我将为您提供项目实现的详细信息,但基本问题是:“如何处理在预排序二叉树中插入节点。

通过预排序BST,我的意思是所有节点都应该以这样的方式插入,即使用预排序遍历(例如用于打印)遍历树时,应该按升序打印节点。

我只需要一个简单的算法。我尝试了这里给出的一个简单的插入算法(在stackoverflow上,但是好像不正确(也在纸上试过));。

节点基本上是这样的:

typedef struct testNode{
    int key;
    struct testNode *leftChild;
    struct testNode *rightChild;
}NODE;

插入数据只是唯一整数的列表。我用int作为键创建了一个节点,然后应该把这个节点添加到树中。我有根节点,它从一个空指针开始。

如果有什么不清楚,请原谅。

感谢您的帮助!

编辑:基于下面提供的算法,这是我想出来的:

void insert(NODE **tree,int key){
if(*tree){
    if ((*tree)->key >= key){
        //Insert before this .....
        NODE *temp = createNode(key);
        temp->lc = (*tree);
        (*tree) = temp;

    }
    else if(!(*tree)->rc){
        //Right Child doesn't exist ....
        insert(&(*tree)->lc,key);
    }
    else if((*tree)->rc->key < key){
        //Right child exists and is smaller than spread ... insert left ...
        insert(&(*tree)->lc,key);
    }
    else{
        //Right child exists and is greater than spread ... insert right ...
        insert(&(*tree)->rc,key);
    }
    //If the code as progressed to this point, insertion must have occured, 
            //and the code returns ......   
} else {
    //the **tree pointer points to NULL. Insert here ....
    SPREADNODE *temp = createSpreadNode(spread);
    //temp->lc = (*tree);
    (*tree) = temp;
}
}

共有1个答案

熊俊人
2023-03-14

考虑一下预排序 BST 的定义:根节点是最小的元素,它的两个子节点或也预排序树,使得右子树的根大于左子树中的任何值。

所以,一个可行的算法是:

  1. 如果新节点小于根节点,请使其成为新根节点,并将现有树作为两个子节点之一指向。
  2. 如果新节点大于根,但小于右子树的根,请以递归方式将其插入到左子树中。
  3. 否则,请以递归方式将其插入到正确的子树中。

这不太可能产生一个非常平衡的树,但它应该有效。我可以想到至少一个其他简单的替代方案,毫无疑问,有一些方法可以使事情更加平衡,我将其留给读者作为练习;-)

 类似资料:
  • 我想实现一种将排序数组插入二叉搜索树的算法,但我不希望最终得到一棵只向一侧生长的树。 你有什么想法吗? 谢谢你。

  • 在我的解决方案中,我遇到了一个“None's not have.val”的问题。。。我想知道如何调试它。。。 以下是描述 将BST转换为已排序的循环双链接列表。将左指针和右指针视为双链接列表中上一个和下一个指针的同义词。] 让我们以下面的BST为例,它可能会帮助您更好地理解这个问题:我们希望将这个BST转换为一个循环双链接列表。双链表中的每个节点都有一个前导节点和后继节点。对于循环双链表,第一个元

  • 问题内容: 我在将这两种算法结合在一起时遇到麻烦。我被要求修改以返回将元素插入数组的索引。然后有人要求我实现一个使用my 对随机生成的数组进行排序的。 我按照预期的方式工作,每当我单独测试它时都返回正确的索引。我写信是为了了解它是如何工作的,并使其也能工作。一旦将两者结合在一起,它就会崩溃。我知道我在一起实施起来不正确,但是我不确定问题出在哪里。 这是我得到的: 我在运行它时得到的返回值是。有什么

  • 给定二叉查找树(BST)和整数val的根。 在BST中找到该节点的值等于val的节点,并返回以该节点为根的子树。如果这样的节点不存在,则返回null。 为什么'ans=root'不起作用??

  • 我试着删除二叉查找树的节点,当我打印出来的时候,我得到的结果实际上不是这个删除,实际上可以删除二叉树本身的任何键。 我是二进制搜索树的新手。有人能帮我写代码吗?我们将感谢您的帮助。 谢谢 完整代码

  • 我正在尝试为二叉搜索树类编写一种方法来修改平衡的普通树,这使得树仅在一侧具有节点。 从元素在不平衡树中出现的顺序来看,依序遍历(左、中、右)之间似乎存在某种关系。