bitree.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #pragma once
  2. #include <common/glib.h>
  3. struct bt_node_t
  4. {
  5. struct bt_node_t *left;
  6. struct bt_node_t *right;
  7. struct bt_node_t *parent;
  8. void *value; // 数据
  9. } __attribute__((aligned(sizeof(long))));
  10. struct bt_root_t
  11. {
  12. struct bt_node_t *bt_node;
  13. int (*cmp)(struct bt_node_t *a, struct bt_node_t *b); // 比较函数 a>b 返回1, a==b返回0, a<b返回-1
  14. /**
  15. * @brief 释放结点的value的函数
  16. * @param value 结点的值
  17. */
  18. int (*release)(void *value);
  19. };
  20. /**
  21. * @brief 创建二叉搜索树
  22. *
  23. * @param node 根节点
  24. * @param cmp 比较函数
  25. * @return struct bt_root_t* 树根结构体
  26. */
  27. struct bt_root_t *bt_create_tree(struct bt_node_t *node, int (*cmp)(struct bt_node_t *a, struct bt_node_t *b));
  28. /**
  29. * @brief 创建结点
  30. *
  31. * @param left 左子节点
  32. * @param right 右子节点
  33. * @param value 当前节点的值
  34. * @return struct bt_node_t*
  35. */
  36. struct bt_node_t *bt_create_node(struct bt_node_t *left, struct bt_node_t *right, struct bt_node_t *parent, void *value);
  37. /**
  38. * @brief 插入结点
  39. *
  40. * @param root 树根结点
  41. * @param value 待插入结点的值
  42. * @return int 返回码
  43. */
  44. int bt_insert(struct bt_root_t *root, void *value);
  45. /**
  46. * @brief 搜索值为value的结点
  47. *
  48. * @param root 树根结点
  49. * @param value 值
  50. * @param ret_addr 返回的结点基地址
  51. * @return int 错误码
  52. */
  53. int bt_query(struct bt_root_t *root, void *value, uint64_t *ret_addr);