数据结构与算法: tree

实现来自算法精解:C语言描述(本人练习数据结构与基本算法记录,供回忆知识点使用)

代码上传至github:
https://github.com/G1enY0ung/DataStructure-and-Algorithm


二叉树

每个结点最多只有两个子节点,这个都好理解,不在多说。

遍历

1.先序
2.中序
3.后序

这个只要记住序是以根节点为顺序参考的,先序就是先根节点。

平衡

要想保持树的平衡,要保证树的所有叶子结点都在同一层上,或者树的所有叶子结点都在最后两层上, 树的倒数第二层必须为满,这样才算平衡。

定义如下:

typedef struct BiTreeNode_
{
    void *data;
    struct BiTreeNode_ *left;
    struct BiTreeNode_ *right;
} BiTreeNode;

typedef struct BiTree_
{
    int size;
    int (*compare)(const void *key1, const void *key2);
    void (*destroy)(void *data);
    BiTreeNode *root;
} BiTree;

void bitree_init(BiTree *tree, void (*destroy)(void *data));
void bitree_destroy(BiTree *tree);
int bitree_ins_left(BiTree *tree, BiTreeNode *node, const void *data);
int bitree_ins_right(BiTree *tree, BiTreeNode *node, const void *data);
void bitree_rem_left(BiTree *tree, BiTreeNode *node);
void bitree_rem_right(BiTree *tree, BiTreeNode *node);
int bitree_merge(BiTree *merge, BiTree *left, BiTree *right, const void *data);

#define bitree_size(tree) ((tree)->size)
#define bitree_root(tree) ((tree)->root)
#define bitree_is_eob(node) ((node) == NULL)
#define bitree_is_leaf(node) ((node)->left == NULL && (node)->right == NULL)
#define bitree_data(node) ((node)->data)
#define bitree_left(node) ((node)->left)
#define bitree_right(node) ((node)->right)

具体实现参考github和算法精解这本书。

二叉平衡树

定义如下:

#define AVL_LEF_HEAVY 1
#define AVL_BALANCED 0
#define AVL_RGT_HEAVY -1

typedef struct AvlNode_
{
    void *data;
    int hidden;
    int factor;
} AvlNode;

typedef BiTree BisTree;

void bistree_init(BisTree *tree, int (*compare)(const void *key1, const void *key2), void (*destroy)(void *data));
void bistree_destroy(BisTree *tree);
int bistree_insert(BisTree *tree, const void *data);
int bistree_remove(BisTree *tree, const void *data);
int bistree_lookup(BisTree *tree, void **data);
#define bistree_size(tree) ((tree)->size)

书中把二叉搜索树实现成为了AVL树,AVL树定义参见wiki
https://zh.wikipedia.org/wiki/AVL%E6%A0%91

具体实现参考github和算法精解这本书。

你可能感兴趣的:(数据结构与算法: tree)