bitree.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. int32_t size; // 树中的元素个数
  14. int (*cmp)(void *a, void *b); // 比较函数 a>b 返回1, a==b返回0, a<b返回-1
  15. /**
  16. * @brief 释放结点的value的函数
  17. * @param value 结点的值
  18. */
  19. int (*release)(void *value);
  20. };
  21. /**
  22. * @brief 创建二叉搜索树
  23. *
  24. * @param node 根节点
  25. * @param cmp 比较函数
  26. * @param release 用来释放结点的value的函数
  27. * @return struct bt_root_t* 树根结构体
  28. */
  29. struct bt_root_t *bt_create_tree(struct bt_node_t *node, int (*cmp)(void *a, void *b), int (*release)(void *value));
  30. /**
  31. * @brief 创建结点
  32. *
  33. * @param left 左子节点
  34. * @param right 右子节点
  35. * @param value 当前节点的值
  36. * @return struct bt_node_t*
  37. */
  38. struct bt_node_t *bt_create_node(struct bt_node_t *left, struct bt_node_t *right, struct bt_node_t *parent, void *value);
  39. /**
  40. * @brief 插入结点
  41. *
  42. * @param root 树根结点
  43. * @param value 待插入结点的值
  44. * @return int 返回码
  45. */
  46. int bt_insert(struct bt_root_t *root, void *value);
  47. /**
  48. * @brief 搜索值为value的结点
  49. *
  50. * @param root 树根结点
  51. * @param value 值
  52. * @param ret_addr 返回的结点基地址
  53. * @return int 错误码
  54. */
  55. int bt_query(struct bt_root_t *root, void *value, uint64_t *ret_addr);
  56. /**
  57. * @brief 删除结点
  58. *
  59. * @param root 树根
  60. * @param value 待删除结点的值
  61. * @return int 返回码
  62. */
  63. int bt_delete(struct bt_root_t *root, void *value);
  64. /**
  65. * @brief 释放整个二叉搜索树
  66. *
  67. * @param root
  68. * @return int
  69. */
  70. int bt_destroy_tree(struct bt_root_t *root);