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

C-树插入到特定位置

刁冠宇
2023-03-14

我想写一个函数,将一个节点添加到一个树中,该树以根、节点的值、我想添加新节点的节点的值和一个数字作为参数,根据该数字我将节点添加为左或右子节点(偶数=右子节点,奇数=左子节点)。我不明白我错在哪里,这与BST的概念相同,只是其他条件。如果有任何帮助,我将不胜感激。

例如:

                             6
                            / \
                          3    20

Tnode*insert(Tnode*root,int data,int father,int leftOrRight);插入(根,50,6,2)树将:

                           6
                          / \
                         3   50
                              \
                               20
Tnode* insert(Tnode* root, int data , int father , int leftOrRight)
{
    /* If the tree is empty, return a new node */
    if (root == NULL)
        return newNode(data);
    if (root->data == father)
            if (leftOrRight % 2 == 0)
                root->right = insert(root->right , data , father , leftOrRight);
            else
                root->left = insert(root->left , data , father , leftOrRight) ;
    return root ;
}

 Tnode* newNode(int data)
{
    Tnode* node = (Tnode*)malloc(sizeof(Tnode));
    node->data = data;
    node->left = node->right = NULL;
    return node;
}

共有2个答案

葛学民
2023-03-14

首先,您编写的代码只检查树的根是父亲。我假设您正在尝试检查整棵树。因此,您需要递归调用其左右子级的插入函数来搜索整棵树的父亲。

Tnode* insert(Tnode* root, int data , int father , int leftOrRight)
{
    /* If the tree is empty, return a new node */
    if (root == NULL)
        return newNode(data);
    if (root->data == father)
            if (leftOrRight % 2 == 0)
                root->right = insert(root->right , data , father , leftOrRight);
            else
                root->left = insert(root->left , data , father , leftOrRight) ;
    insert(root->left , data , father , leftOrRight);
    insert(root->right, data , father , leftOrRight); 
    return root; 
}

 Tnode* newNode(int data)
{
    Tnode* node = (Tnode*)malloc(sizeof(Tnode));
    node->data = data;
    node->left = node->right = NULL;
    return node;
}
傅阳
2023-03-14

如果已经找到了应该输入数据的节点,则不需要递归。

Tnode* insert(Tnode* root, int data , int father , int leftOrRight)
{
    /* If the tree is empty, return a new node */
    if (root == NULL)
        return newNode(data);
    if (root->data == father)
    {
        Tnode * node = newNode(data);
        if (leftOrRight % 2 == 0)
        {
           node -> left = root -> right; // can be node -> right as well
           root -> right = node;
        }
        else
        {
           node -> left = root -> left; // can be node -> right as well
           root -> left = node;
        }
    }
    else
    {
       // if the current node is not the required node check the leaves
       insert(root->left , data , father , leftOrRight);
       insert(root->right, data , father , leftOrRight);
    }
    return root; 
}
 类似资料:
  • 我真的需要一些帮助来解决我已经努力了几天的地址簿程序。我正在用C语言处理双向链表。我试图在用户输入的位置将节点添加到列表中,从位置0开始。位置将不会被输入超出范围。(在位置0等位置之前,位置1没有插入)但是位置可以重复:将新节点插入在前一个位置占用者之前的位置。(例如:如果位置1有x,并且新节点插入位置1有y,则位置1现在有y,位置2有x) 我需要获取用户输入的位置号,并检索该位置的当前人员,但我

  • 问题内容: 说我有XML: 如何在As和C之间插入“ nodeB”?在PHP中,最好通过SimpleXML?喜欢: 问题答案: 以下是在其他一些SimpleXMLElement之后插入新的SimpleXMLElement的函数。由于使用SimpleXML不可能直接做到这一点,因此它在幕后使用了一些DOM类/方法来完成工作。 以及如何使用它的示例(特定于您的问题): 如果您想/需要解释它是 如何 工

  • 问题内容: 我正在编写一个脚本,要求我在配置文件的特定部分中添加行。例如 之前: 后: 如您所见,添加了新行。我的bash脚本如何插入行?我猜我将需要使用sed。 问题答案: 如果要在特定字符串匹配之后添加一行:

  • 问题内容: 假设我有一个大小为n的对象的ArrayList。现在,我想在特定位置插入另一个对象,比方说在索引位置k(大于0且小于n),并且我希望索引位置k或之后的其他对象向前移动一个索引位置。因此,有什么方法可以直接在Java中执行此操作。实际上,我想在添加新对象时保持列表排序。 问题答案: 要 插入 的特定索引,使用值到ArrayList中: 此方法将移动列表的后续元素。但是您不能保证列表会保持

  • 问题内容: 我只需要在字符串的第3个位置插入字符“ /”即可。 即成为。 我正在使用一些程序GUI来执行此操作,它接受正则表达式模式和替换。 我知道这一定是超级简单的,但我似乎找不到简单的答案。 问题答案: 将字符串[ ] 开头的3个[ ]字符[ ] 替换为(match ,后跟a )。

  • 问题内容: 假设我们有两个数组: 现在,我想在每个数组的第三个元素之后插入。我该怎么做? 问题答案: 可以用来提取数组的部分,联合数组运算符()可以重新组合部分。 这个例子: 给出: