如何在不使用 CC_TREE** 的情况下在 BST 中插入节点?

How to insert a node in a BST without using CC_TREE**?

所以我有一段代码,我必须在其中向 BST 添加一个节点。我的结构如下:

typedef struct _CC_TREE {
    // Members
    int Value;
    struct _CC_TREE* LChild;
    struct _CC_TREE* RChild;
} CC_TREE;

头文件中的插入函数如下所示:

int TreeInsert(CC_TREE *Tree, int Value);

我必须 return 插入状态。

我试着用另一个函数来做,并将它添加到树中

CC_TREE* InsertNewNode(CC_TREE* Tree, int Value)
{
    if (NULL == Tree)
    {
        Tree = (CC_TREE*)malloc(sizeof(CC_TREE));
        Tree->LChild = NULL;
        Tree->RChild = NULL;
        Tree->Value = Value;
        return Tree;
    }
    if (Value <= Tree->Value)
    {
        Tree->LChild = InsertNewNode(Tree->LChild, Value);
    }
    else if (Value >= Tree->Value)
    {
        Tree->RChild = InsertNewNode(Tree->RChild, Value);
    }
    return Tree;
}

int TreeInsert(CC_TREE *Tree, int Value)
{
    CC_UNREFERENCED_PARAMETER(Tree);
    CC_UNREFERENCED_PARAMETER(Value);

    Tree = InsertNewNode(Tree, Value);
    return 0;
}

我尝试在我的主要函数中构建树:

int retVal = -1;
CC_TREE* usedTree = NULL;

retVal = TreeCreate(&usedTree);
if (0 != retVal)
{
    printf("TreeCreate failed!\n");
    goto cleanup;
}

retVal = TreeInsert(usedTree, 20);
if (0 != retVal)
{
    printf("TreeInsert failed!\n");
}

但由于某种原因 usedTree 仍然为空。我知道我应该在插入函数中使用 CC_TREE** Tree,但我不允许这样做。

The insert function in the header file looks like this:

int TreeInsert(CC_TREE *Tree, int Value);

如果您不能更改函数签名或(呃!)使用全局变量 return 指向调用者的根指针,那么您最好的选择可能是使用虚拟树根。那看起来像这样:

int TreeInsert(CC_TREE *Tree, int Value) {
    // Tree points to a dummy root node containing no data.
    // Tree->LChild is the actual root pointer
    CC_TREE *root = Tree->LChild;
    int status = 0;

    // ... perform insertion, possibly resulting in a different value for the
    // root pointer ...

    Tree->LChild = root;
    return status;
}

假设 TreeInsert() 的第一个参数始终是指向 CC_TREE 的有效指针。如果您这样做,那么 所有其他树函数应该类似地工作。

您可以像这样使用 main() 中的那个:

    int retVal;
    CC_TREE dummy_tree_root = { 0 };
    
    retVal = TreeInsert(&dummy_tree_root, 42);

请注意,此方法实际上通过间接路由使用双指针(无双关语意)。 CC_TREE * 本身不是双指针,但在该指针与其指向的节点的左或右子节点之间仍然存在两级间接。


另请注意,一种更简洁的方法是提供一个表示整个树的包装结构,而不是为此目的使用裸树节点或树节点指针。数据结构将是这样的:

struct node {
    int value;
    struct node *left;
    struct node *right;
};

struct tree {
    struct node *root;
    // optionally other data, such as size, height, etc.
};