打印带编号节点的二进制搜索树

时间:2017-11-29 21:16:40

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

我想对BST进行InOrder遍历并打印节点。我可以打印树很好但我无法正确编号。

以下是所有代码,如果有人想编译并试一试。谢谢!

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



struct Node_h {
    int start_addr;
    int size;

    struct Node_h* left;
    struct Node_h* right;
};

struct Node_h* newHoleNode(int st, int size) {
    struct Node_h* tmp = (struct Node_h*)malloc(sizeof(struct Node_h));
    tmp->start_addr = st;
    tmp->size = size;
    tmp->left = NULL;
    tmp->right = NULL;
    return tmp;
}

int compare(struct Node_h* lhs, struct Node_h* rhs) {
    if(lhs->size != rhs->size) 
        return (lhs->size < rhs->size) ? -1 : 1;
    else if(lhs->start_addr == rhs->start_addr)
        return 0;
    else
        return (lhs->start_addr < rhs->start_addr) ? -1 : 1;
}

struct Node_h* insertHole(struct Node_h* cur, struct Node_h* add) {
    /* If the tree is empty, return a new node */
    if (cur == NULL) 
        return add;

    /* Otherwise, recur down the tree */
    if (compare(add, cur) == -1) {
        cur->left  = insertHole(cur->left, add);
    }
    else if(compare(add, cur) == 1) {
        cur->right = insertHole(cur->right, add);
    }

    /* return the (unchanged) node pointer */
    return cur;
}

int printHoles(struct Node_h* cur, int num) {
    if(cur == NULL) {
        return 0;
    }
    int t = 1 + num;
    t += printHoles(cur->left, num);
    printf("Hole %d: start location = %d, size = %d\n", t, cur->start_addr, cur->size);
    t += printHoles(cur->right, t);
    return t;
}

int main(int argc, char const *argv[]) {
    srand(time(NULL));   // should only be called once
    int pid = 0;
    struct Node_h* root = NULL;
    for (int i = 0; i < 1000; ++i) {
        int size = rand() % 10000;
        root = insertHole(root, newHoleNode(pid++, size));
    }
    printHoles(root, 0);
    return 0;
}

编号总是大量随机+/-数字或类似的东西。救命啊!

第1洞:开始位置= 168,尺寸= 12

第2洞:开始位置= 665,尺寸= 12

第4洞:开始位置= 506,尺寸= 14

第5洞:开始位置= 908,大小= 30

第11洞:开始位置= 498,大小= 31

第13洞:开始位置= 340,大小= 38

第14洞:开始位置= 378,大小= 44

第29洞:开始位置= 303,大小= 54

第30洞:开始位置= 948,尺寸= 58

第60洞:开始位置= 503,尺寸= 70

3 个答案:

答案 0 :(得分:2)

使num指针并在访问节点后直接递增。通过以下修改,printHoles不再需要返回int

void printHoles(struct Node_h* cur, int* num) {
  if (cur == NULL) {
    return;
  }
  printHoles(cur->left, num);
  printf("Hole %d: start location = %d, size = %d\n", *num, cur->start_addr, cur->size);
  (*num)++;
  printHoles(cur->right, num);
}

答案 1 :(得分:0)

如果你重写你的功能

int printHoles(struct Node_h* cur, int num) {
    if(cur == NULL) {
        return num;
    }
    num = printHoles(cur->left, num) + 1;
    printf("Hole %d: start location = %d, size = %d\n", num, cur->start_addr, cur->size);
    num = printHoles(cur->right, num);
    return num;
}

它应该正确跟踪输出的值的数量。在每次printf() - 调用之前,num现在递增1并且每个递归调用返回,然后输出多少个值。这应该做你期望的。

答案 2 :(得分:0)

// num is the number of nodes printed so far
// return the number of nodes printed so far
int printHoles(struct Node_h* cur, int num) {
    if(NULL == cur) {
        // last printed not changed
        return num;
    }
    num = printHoles(cur->left, num);
    printf("%d. size = %d\n", num + 1, cur->size);
    num = printHoles(cur->right, num + 1);
    return num;
}

我们可以使用num来跟踪到目前为止打印的节点数。如果不使用t,这应该更清晰,更正确。