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

在BST中插入具有全局根的节点

舒宏富
2023-03-14
struct node{
    int data;
    struct node*left,*right;
};

node* root;   //global root

node* getNode(int item)
{
    node* new_node = new node;
    new_node->data = item;
    new_node->left=new_node->right=NULL;
    return new_node;
}

node* insert(node* localroot, int item)
{

    if(localroot == NULL){
        localroot = getNode(item);
    }
    else if(item < localroot->data)
        localroot->left = insert(localroot->left, item);
    else if(item > localroot->data)
        localroot->right = insert(localroot->right, item);
    root = localroot;
    return root;   //Why do I have to return root if it is global? 
                   //without this output is wrong
}

void inorder(node* root)
{
    if(root != NULL){
        inorder(root->left);
        std::cout << root->data << ' ';
        inorder(root->right);
    }
}

void postorder(node* root)
{
    if(root != NULL){
        postorder(root->left);
        postorder(root->right);
        std::cout << root->data << ' ';
    }
}

int main()
{
    insert(root, 15);
    insert(root, 9);
    insert(root, 2);
    insert(root, 1);
    insert(root, 4);
    insert(root, 18);

    std::cout<<"inorder traversal of tree is: ";
    inorder(root);
    std::cout << "\nPostOrder: ";
    postorder(root);

    return 0;
}

通常我们主要称之为insert,比如root=insert(root,10) (其中根在main()中声明)
我想声明root globaly,但insert函数不能为void,它必须返回node*值。我可以得到一个解释吗<如果有更好的方法,请分享(实际上我想把insert变成void类型)<问候,


共有2个答案

吉凯捷
2023-03-14

您的函数插入的返回类型意味着您必须通过以下方式调用它

root = insert(root, 15);

在你的职责范围内,这些陈述

root = localroot;
return root;   //Why do I have to return root if it is global? 
               //without this output is wrong

你错了。

使用您的函数声明,可以通过以下方式定义函数

node* insert( node* localroot, int item )
{

    if ( localroot == NULL ){
        localroot = getNode( item );
    }
    else if ( item < localroot->data )
        localroot->left = insert( localroot->left, item );
    else if ( item > localroot->data )
        localroot->right = insert( localroot->right, item );

    return localroot; 
}
费学
2023-03-14

您编写插入的方式要求它始终返回它修改或创建的节点。这可确保在没有子节点的节点上的插入设置正确的成员(左或右)。

您可以通过传入对要设置的指针的引用,将root重写为纯命令:

void insert(int item, node*& localroot = root) {
    if (localroot == nullptr) {
        localroot = getNode(item);
        return;
    }

    if (item == localroot->data) {
        return;
    } else if(item < localroot->data) {
        insert(item, localroot->left);
    } else if(item > localroot->data) {
        insert(item, localroot->right);
    }
}

要实现的关键点是,localroot的赋值将反映在数据结构中,因此:

  • 当您第一次调用插入(项目)时,localroot是对root的引用,它是一个空指针。因此,第一个子句适用,您用一个新节点覆盖localRoot。因为localRoot是对root的引用,所以也会更新。
  • 在后续调用插入时,您将沿着树向下下降,直到您最终到达必须进一步下降的节点N,但子节点为nullptr。现在下降时,localRoot绑定到N-

如果默认参数对您来说太神奇,请将其分为两个函数:

void insert_helper(int item, node*& localroot) {
    // as above
}

void insert(int item) {
    insert_helper(item, root);
}

 类似资料:
  • 我创建了一个二叉查找树类。我创建了我的插入方法、高度方法和打印方法。当我插入时,一切看起来都很好。如果根为空,我创建一个新的根并设置该项目。但是当我调用我的高度方法时,它打印出2而不是1。当我调用print方法时,它会两次打印出包括root在内的所有元素。例如,我按以下顺序插入了以下元素:9, 5, 4, 55, 555 当我调用PREorderPRINT方法时,它会输出:9, 5, 4, 9,

  • 编辑:我想出来了——放弃了这个设计,重新开始,它成功了!谢谢你的建议。 我正在做一个BST算法的家庭作业,我绝望地被困在插入方法上。我在网上找到的所有资源都有一个与我创建的版本相似的版本,但是我没有通过教授给我们的JUnit测试。我可以通过基本情况(root.payload==value的空根和二叉树)。不过,我似乎无法通过下一个测试。这是我的插入(root, value)方法代码: 最终返回的是

  • 我正在尝试使用(不平衡的)BST实现树集。我还希望为树中的所有节点维护一个有序的双链接列表。 链表是在2个前哨节点的帮助下维护的,一个头节点和一个尾节点。因此,要遍历链表,您需要从头节点开始,检查它的属性。 我有一个递归的方法,就像这样; 其中和设置在链表中将插入新节点的位置的边界。 我在维护节点的和属性时遇到了问题。

  • 我正在为BST开发一个递归插入方法。假定该函数是一个递归辅助方法,并且位于名为Node的私有类中。节点类位于名为BinarySearchTree的类中,该类包含根的实例变量。当我尝试插入一个元素时,我在以下位置得到一个NullPointerException: 这左=插入((节点)左)。元素); 我不确定为什么会发生这种情况。如果我理解正确,在BST中,我假设将项目插入到所横穿路径的最后一点。感谢

  • 我正在尝试实现BST,但是我的树的head值每次都返回无。我尝试在Python中查找其他实现,但它们通常只是声明一个根并将其传递到类本身之外,而不是将head自包含在类中。

  • 我知道,不允许重复。例如,如果我有一个词“RABSAB”。 上述字符串的二进制搜索树是: 如果我们想在树中包含重复项呢。这棵树将如何改变?我在一次采访中被问到这个问题。 他们让我画: 二叉树 不平衡二叉搜索树 没有重复项的二叉搜索树 具有重复项的二叉搜索树 感谢您的帮助! PS:帮我画相关的树