二进制搜索树在C中插入函数

时间:2013-04-10 18:54:43

标签: c struct null binary-search-tree avl-tree

对于这个问题的未来观众谁可能需要这类问题的帮助:我通过组合2个函数(InsertNode()和InTree())修复它我不确定这是不好的做法我和我#39;如果它确实解决了这个问题,或者它只是掩盖了它,那么我会回复你们,但它似乎正在起作用......

我已经在本网站(以及其他网站)上查看了各种答案,并从那些我得到的解决方案中找到了无用的帮助(尝试过但没有工作或只是没有做过#39; t与我的程序不同)。 插入函数(我已将其隔离并认为这是有问题的代码)在某处导致程序崩溃的某些错误。

NP InTree(NP Node,NP Root)
{
    if (Root == NULL)
    {
        Root=Node;
        return Root;
    }
    else
    {
        if (Node->Input < Root->Input)
        {
            return InTree(Node,Root->Left);
        }
        else if (Node->Input > Root->Input)
        {
            return InTree(Node,Root->Right);
        }
        else
        {
            puts("Duplicate");
            return NULL;
        }
    }
}

void InsertNode(int I, TP Tree)
{

    NP Node;
    Node=(NP)malloc(sizeof(struct AVLNode));
    InitializeNode(Node);
    Node->Input=I;
    Node->Height=0;
    Node->Left=NULL;
    Node->Right=NULL;
    InTree(Node,Tree->Root);
    Tree->Size++;
}

NP是节点指针,TP是树指针

Node变量是通过InsertNode()

发送的初始化节点
void InitializeTree(TP Tree)
{

    Tree->Root=NULL;
    Tree->Size=0;
}

void InitializeNode(NP Node)
{

    Node->Input=0;
    Node->Height=0;
}

以上是我的初始化函数,以防您需要查看它们。

在调用任何函数之前,树的内存在主类中分配。

从我看到的测试中看到的主要问题是,一旦Root等于Node,它就会保持为空。

我有什么想法可以解决这个问题?

3 个答案:

答案 0 :(得分:0)

void InsertNode(int I, TP Tree)为新节点分配mem,但是当你调用NP InTree(NP Node,NP Root)时,你只修改本地指针地址。您需要使用指向指针的指针(即NP InTree(NP Node, NP *ppRoot))或以下示例:

if (Node->Input < Root->Input) {
    if(Root->Left == NULL) {
        Root->Left = Node;
    } else {
        return InTree(Node,Root->Left);
    }
} else if (Node->Input > Root->Input) {
    if(Root->Right== NULL) {
        Root->Right= Node;
    } else {
        return InTree(Node,Root->Right);
    }
} else {
    puts("Duplicate");
    return NULL;
}

聚苯乙烯。我注意到你分配struct AVLNode ...是NP的AVLNode(typedef struct AVLNode* NP)的typedef?我不知道你的结构是什么,所以我不能说。从技术上讲,AVL与B树的不同之处在于它们是自平衡的...... http://en.wikipedia.org/wiki/AVL_tree

答案 1 :(得分:0)

InTree函数中,Root等于Node,它只在本地更改内存。

相反,您可能需要使用指向指针的指针来实现您正在尝试的目标。

答案 2 :(得分:0)

我会这样做的。您的插入函数不区分特殊情况(空树)和一般情况(非空树)。

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

typedef struct NODE
{
  struct NODE *left  ;
  struct NODE *right ;
  int          value ;
  int          depth ;
} NODE ;

typedef struct TREE
{
  NODE *root  ;
  int   count ;
} TREE ;

NODE *node_create( int value )
{
  NODE *instance = (NODE*) calloc( 1 , sizeof(NODE) ) ;
  instance->value = value ;
  return instance ;
}

TREE *tree_create()
{
  TREE *instance = (TREE*) calloc( 1 , sizeof(TREE) ) ;
  return instance ;
}

NODE *tree_find_and_insert( NODE *parent , int value )
{
  NODE *child = NULL ;

  if ( value < parent->value )
  {
    if ( parent->left == NULL )
    {
      child = node_create(value) ;
      child->depth = ++ parent->depth ;
      parent->left = child ;
      return child ;
    }
    else
    {
      return tree_find_and_insert(parent->left , value ) ;
    }
  }
  else if ( value > parent->value )
  {
    if ( parent->right == NULL )
    {
      child = node_create(value) ;
      child->depth = ++ parent->depth ;
      parent->right = child ;
      return child ;
    }
    else
    {
      return tree_find_and_insert( parent->right , value ) ;
    }
  }
  else /* ( value == parent->value ) */
  {
    // NO-OP by design: dupes fall out and NULL is returned
  }

  return child ;
}

NODE *tree_insert( TREE *tree , int value )
{
  NODE *inserted = NULL ;
  if ( tree->root == NULL )
  {
    tree->root  = node_create( value ) ;
    tree->count = 1 ;
    inserted = tree->root ;
  }
  else
  {
    inserted = tree_find_and_insert( tree->root , value ) ;
  }
  return inserted ;
}

int main ( int argc , char *argv[] )
{
  TREE *my_tree = tree_create() ;
  int i ;

  for ( i = 1 ; i < argc ; ++i )
  {
    char *arg = argv[i] ;
    int   n   = atoi(arg) ;

    tree_insert( my_tree , n ) ;

  }

  return 0 ;
}