在二叉树中插入元素

时间:2013-04-30 05:30:20

标签: c tree binary-tree binary-search-tree

尝试通过网络进行大量探索,但可以得到任何帮助, 它就像在二进制搜索树中添加一个节点一样。

问题:请求用于将节点添加到二叉树的算法和代码段。 (或指出我更正网址)

假设: 根据我的理解,二叉树二进制搜索树是不同的?如果我错了,请纠正我。

(请求:如果您正在编写代码片段,请使用适当的变量名称,这有助于理解)

例如:二叉树

5 7 3 x1 x2 x3

                 5

          7               3

   x1       x2       x3       

二进制搜索树5 7 3 2 4 6

                   5
          3               7

   2          4       6       





insert(int key, struct node **root)
{
    if( NULL == *root )`
    {
        *root = (struct node*) malloc( sizeof( struct node ) );`
        (*root)->data = key;
        (*root)->left = NULL;    
        (*root)->right = NULL;  
    }
    else if(key < (*root)->data)
    {
        insert( key, &(*root)->left );
    }
    else if(key > (*root)->data)
    {
        insert( key, &(*root)->right );
    }
}

5 个答案:

答案 0 :(得分:6)

二叉树和二进制搜索树之间的区别在于,虽然它们都有限制,每个节点最多可以有2个子节点,但二进制搜索树(BST)的左子节点也必须相等或者更小。价值及其正确的孩子必须具有更大或相等的价值。这就是为什么它被称为“搜索”树,因为所有内容都是按数字排序的,并且它有一个O(logn)运行时间用于搜索。

因为不需要成为BST,所以可以将二叉树存储在向量(数组)中。当您插入到矢量中时,您将按照水平顺序方式构建二叉树。代码如下:

// typedef the node struct to NODE
// nodeVector similar to STL's vector class
insert(int key, NODE** nodeVector)
{
    NODE *newNode = (NODE*) malloc( sizeof( NODE ) );
    newNode->data = key;
    newNode->left = NULL;    
    newNode->right = NULL;

    // add newNode to end of vector
    int size = nodeVector->size();
    nodeVector->push_back(newNode);

    // if newNode is not root node
    if(nodeVector->size() > 1)
    {
        // set parent's child values
        Node* parent = (size/2)-1; // take advantage of integer division instead of using floor()
        if (parent->left == NULL)
        {
            parent->left = newNode;
        }
        else
        {
            parent->right = newNode;
        }
    }
}

答案 1 :(得分:2)

队列数据结构可用于将元素插入到二叉树中,因为在二进制树中,节点的顺序不会被维护,因此我们将在找到任何空值时立即插入节点。 使用Queue,我们将遍历Level Order Traversal中的二叉树。

struct Treenode* temp;

Q = CreateQueue();
EnQueue(Q,root);

while(!IsEmptyQueue(Q))
{
    temp = DeQueue(Q);
    if(temp->left)
        EnQueue(Q,temp->left);
    else
    {
        temp->left=newNode;
        DeleteQueue(Q);
        return;
     }
     if(temp->right)
        EnQueue(Q,temp->right);
    else
    {
        temp->right=newNode;
        DeleteQueue(Q);
        return;
     }
}

答案 2 :(得分:0)

因为,我不能发表评论我写这篇文章 二元树插入函数的上述答案是错误的 假设0,1,2,3,4,5顺序通过插入函数,
它的生成树如

       0
      /
     1
      \ 
       2
      /
     3
      \
       4
      /
     5`<br/>

其中inorder遍历将是1 3 5 4 2 0
而答案应该是

                     0
                   /  \
                  1    2 
                 / \  /  
                3   4 5

其中,遍历遍历为3 1 4 0 5 2。

答案 3 :(得分:0)

由于我也面临同样的问题,我想通过网络提出以下解决方案: -

您可以使用队列来存储我们想要放置新节点的当前节点,就像我们在级别顺序遍历中那样,然后我们逐层插入​​节点。

以下链接可能对您有所帮助: -

http://www.geeksforgeeks.org/linked-complete-binary-tree-its-creation/

答案 4 :(得分:0)

我发布这个作为答案,因为我没有发表评论的必要声誉。除了bagelboy之外,所有其他人都误将树误解为二进制搜索树或完整二叉树。问题是简单的Binary Tree和Bagelboy的答案看起来是正确的。