二进制搜索树问题

时间:2014-06-23 19:04:29

标签: c binary-tree

我正在处理一个二进制树,其中列出了数据,但我无法判断列表是否正在填充。代码运行正常但是当我尝试打印出树时,我的代码被冻结了。我相信一切都得到了恰当的指导,但很明显,逻辑中存在一个缺陷。

struct declarations

typedef struct lineList
{
    int lineNum;
    LIST *next;
}LIST;

typedef struct nodeTag{
   char data[80];
   LIST *lines;
   struct nodeTag *left;
   struct nodeTag *right;
} NODE;

声明并从主要传递给函数

NODE *root = NULL;
readFromFile(argv[1], root);

readfromfile(工作函数)然后调用insertword

insertWord(root, keyword, lineNum);

insertWord,addToList函数(问题区域)

NODE *allocateNode(char *data, int line)
{
    NODE *root;
    LIST *newNum;
    if(!(root = (NODE *) malloc (sizeof(NODE))))
        printf( "Fatal malloc error!\n" ), exit(1);

    strcpy(root->data, data); //copy word
    (root)->left  = (root)->right = root->lines = NULL; //initialize

    if (!(newNum =(LIST *) malloc (sizeof(LIST))))
        printf( "Fatal malloc error!\n" ), exit(1);
    newNum->lineNum = line;
    root->lines = newNum;

    return root;
}

/****************************************************************
   ITERATIVE Insert
*/
NODE *insertWord(NODE *root, char *data, int line)
{
    NODE *ptr_root = root;
    printf("inserting %s\n", data);

    if(root == NULL)
    {
        root = allocateNode(data, line);
        return root;
    }
    while(ptr_root)
    {   
      if (strcmp(data, ptr_root->data > 0))
      {
          if(ptr_root->right)
            ptr_root = ptr_root->right;  //traverse right
          else
            ptr_root->right = allocateNode(data, line);
      }
      else if (strcmp(data, ptr_root->data) < 0)
      { 
          if(ptr_root->left) //traverse left
            ptr_root = ptr_root->left;
          else
            ptr_root->left = allocateNode(data, line);
      }
      else
        {
            printf("Node already in the tree!\n");
            addToList(ptr_root, line);
        }
    }
    printf("5\n");
   return root;
}

void printTreeInorder(NODE *root)//simple print, freeze on call to function
{   
   if(root)
    {
      printTreeInorder(root->left);
      printf( "%s\n",  root->data );
      printTreeInorder(root->right);
   }
   return;
}

1 个答案:

答案 0 :(得分:2)

让我们看一下insertWord()

  1. 在while循环结束时,我们知道ptr_root == NULL
  2. 然后我们为ptr_root分配内存。
  3. 然后我们初始化ptr_root
  4. 的内容
  5. 然后我们在ptr_root上执行内存泄漏
  6. 请注意,您需要保留新节点的父节点,并且需要将其左或右指针指向此新节点。

    听起来你也懂得如何使用调试器。如果这是真的,您应该能够看到root在对insertWord()的调用之间没有变化。


    在您通过尝试修复发布的代码中,您遗漏了一个关键字。让我们来看一个函数:

    void foo(NODE *root) {
        printf("before malloc:   %p\n", root);
        root = malloc(sizeof(NODE));
        printf("after malloc:    %p\n", root);
    }
    
    int main() {
        NODE *root = NULL;
        printf("before function: %p\n", root);
        foo(root);
        printf("after function:  %p\n", root);
    }
    

    此代码将生成:

    before function: 0x0
    before malloc:   0x0
    after malloc:    0x123ab129
    after function:  0x0
    

    请注意,对root值的任何更改都不会传播到函数之外。但是,您更改为*root的内容将会出现。