【问题标题】:BST with a recursion and given structures具有递归和给定结构的 BST
【发布时间】:2023-03-19 11:21:01
【问题描述】:

我必须为 BST 编写一些方法,我有一些问题,让我解释一下。

我有以下结构:

struct node {
    struct node *lChild; 
    struct node *rChild; 
    int value; 
};

struct tree {
    struct node *root;
};

还有以下功能:

struct tree* constructNewTree()
{
    struct tree *T=malloc(sizeof(struct tree));
    T->root=NULL;

    return T;
}

struct node* constructNewNode(int i)
{
    struct node *N=malloc(sizeof(struct node));
    N->value=i;
    N->lChild=NULL;
    N->rChild=NULL;

    return N;
}

在我的主目录中,我必须调用它(例如):

int main()
{
    struct tree *T;
    T=constructNewTree();

    insertKey(5,T);
    insertKey(2,T);
    insertKey(9,T);
    return 0;
}

我要做的是使用递归创建函数 insertKey(int i, struct tree *T)。

我想做类似的事情

void insertKey(int i, struct tree *T)
{
    if (T->root==NULL) {
        T->root=constructNewNode(i);
        return;
    }
    else {
        if (i<=T->root->value) {
            T->root->lChild=constructNewNode(i);
        else if (i>T->root->value) {
            T->root->rChild=constructNewNode(i);
        }
    }
}

但它并没有走得太远,使用递归可以让我再次调用 insertKey 但我似乎无法以相同的方式使用节点和树。

有谁知道我如何在不改变给定结构的情况下做到这一点?

非常感谢。

【问题讨论】:

  • 这对我来说像是一道作业题。标签已适当更新。

标签: c recursion tree binary-search-tree


【解决方案1】:

您的 insertKey 将 Tree 作为其参数。树只是指向最顶端的指针。

我建议您编写一个 insertKey 函数,该函数接受一个节点作为其参数。同样在这个函数中,你必须检查左/右孩子是否有另一棵树。

目前你只是构建一个新节点,不管那里有什么。这将覆盖任何以前的插入。

【讨论】:

  • 谢谢,但这不会和 main() 上的代码混淆吗?也许我应该创建另一个函数 insertNode,它做同样的事情,但使用节点,然后在 insertKey 中检查 T->root 是否为空,如果不使用带有 T->root 作为参数的 insertNode?​​span>
  • +1 这是正确的做法。现在给 Starkey +15,这样我们就可以继续了 :)
  • 在我这样做之前的最后一个问题,对于其他方法,我必须编写 findKey(int i, struct tree *T) 或 deleteKey(int i, struct tree *T) 之类的代码,每次都会出现同样的问题,我应该以同样的方式进行吗?
  • 是的,你应该这样做。您应该始终只为参数传递一个节点结构,而不是树。老实说,我不知道为什么要为 Tree 设置单独的结构,因为它实际上只是一个节点。
  • 它是这样给出的,我不知道为什么。无论如何,非常感谢你;)
猜你喜欢
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 2012-05-06
  • 2021-07-11
  • 2012-01-09
  • 2012-10-22
  • 1970-01-01
  • 2013-07-16
相关资源
最近更新 更多