二叉查找树
2014-01-04 19:43
218 查看
#include <stdio.h> #include <stdlib.h> struct node { int data; struct node *parent; struct node *left; struct node *right; }; struct tree { struct node *root; }; /* 创建一个结点 */ struct node *node_alloc(int val) { struct node *ret = (struct node *) malloc(sizeof(struct node)); ret->data = val; ret->parent = NULL; ret->left = NULL; ret->right = NULL; return ret; } /* 销毁一个结点 */ void node_dealloc(struct node *n) { n->parent = NULL; n->left = NULL; n->right = NULL; free(n); } /* 销毁整个子树 */ void node_destroy(struct node *n) { if (n->left != NULL) { node_destroy(n->left); } if (n->right != NULL) { node_destroy(n->right); } node_dealloc(n); } /* 返回子树中最小的元素 */ struct node *node_minimum(struct node *n) { while (n->left != NULL) { n = n->left; } return n; } /* 返回子树中最大的元素 */ struct node *node_maximum(struct node *n) { while (n->right != NULL) { n = n->right; } return n; } /* 查找结点在中序遍历序列中的前趋 */ struct node *node_predecessor(struct node *n) { struct node *ret; if (n->left != NULL) { return node_maximum(n->left); } else { ret = n->parent; while (ret != NULL && ret->left == n) { n = ret; ret = n->parent; } } return ret; } /* 查找结点在中序遍历序列中的后继 */ struct node *node_successor(struct node *n) { struct node *ret; if (n->right != NULL) { return node_minimum(n->right); } else { ret = n->parent; while (ret != NULL && ret->right == n) { n = ret; ret = n->parent; } } return ret; } /* 输出子树的中序遍历序列 */ void node_inorder_traversal(struct node *n) { if (n->left != NULL) { node_inorder_traversal(n->left); } printf("%d ", n->data); if (n->right != NULL) { node_inorder_traversal(n->right); } } /* 插入 */ void tree_insert(struct tree *t, int val) { struct node *parent = NULL; struct node *child = t->root; /* 查找应该插入的位置parent */ while (child != NULL) { parent = child; if (val < child->data) { child = child->left; } else { child = child->right; } } /* 如果parent == NULL说明为空树 */ if (parent == NULL) { t->root = node_alloc(val); } else { child = node_alloc(val); child->parent = parent; if (val < parent->data) { parent->left = child; } else { parent->right = child; } } } /* 删除 */ void tree_erase(struct tree *t, struct node *n) { struct node *del; struct node *child; if (n == NULL) { return; } /* 查找应该删除的结点del,del最多只有一个子结点 */ if (n->left == NULL || n->right == NULL) { del = n; } else { del = node_successor(n); /* 若待删除的结点不为n,将待删除结点的数据赋给n */ n->data = del->data; } /* 调整子节点的父结点指针 */ if (del->left != NULL) { child = del->left; } else { child = del->right; } if (child != NULL) { child->parent = del->parent; } /* 若父结点为NULL,说明待删除的结点为树的根结点,此时需要重新调整树的根结点 */ if (del->parent == NULL) { t->root = child; } /* 调整父结点的子结点指针 */ else if (del->parent->left == del) { del->parent->left = child; } else { del->parent->right = child; } /* 销毁结点 */ node_dealloc(del); } /* 查找,返回中序遍历序列中第一个匹配的 */ struct node *tree_search(struct tree *t, int val) { struct node *ret = t->root; while (ret != NULL) { if (val == ret->data) { break; } else if (val < ret->data) { ret = ret->left; } else { ret = ret->right; } } return ret; } /* 树结构初始化 */ void tree_init(struct tree *t) { t->root = NULL; } /* 销毁整棵树 */ void tree_destroy(struct tree *t) { if (t->root != NULL) { node_destroy(t->root); t->root = NULL; } } /* 输出树的中序遍历序列 */ void tree_inorder_traversal(struct tree *t) { if (t->root != NULL) { node_inorder_traversal(t->root); printf("\n"); } } int main(void) { struct tree t; struct node *n; tree_init(&t); tree_insert(&t, 1); tree_insert(&t, 2); tree_insert(&t, 3); tree_insert(&t, 4); tree_insert(&t, 5); tree_inorder_traversal(&t); n = tree_search(&t, 1); tree_erase(&t, n); tree_inorder_traversal(&t); n = tree_search(&t, 3); tree_erase(&t, n); tree_inorder_traversal(&t); n = tree_search(&t, 4); tree_erase(&t, n); tree_inorder_traversal(&t); tree_destroy(&t); return 0; }
相关文章推荐
- 二叉查找树(BST)---拷贝 相等判断 查找节点 统计节点 统计层数 判断BST
- 二叉查找树(BST)的实现(C++)
- 数据结构002 - 二叉查找树(BST)
- 递归和非递归输出二叉查找树中所有的节点
- 算法导论第十二章:二叉查找树
- 证明:在一棵有n个结点的二叉查找树中,刚好有n-1种可能的旋转
- 二叉查找树——算法导论第12章简易代码实现~
- 二叉查找树的基类实现(五)
- 二叉查找树
- 二叉查找树
- 自平衡二叉查找树(一)-----------AVL树分析和代码实现
- 《算法导论》第12章 二叉查找树 (2)查找、插入与删除
- C#实现二叉查找树
- C#构建二叉查找树
- 二叉查找树(四)
- 找出二叉查找树中第n大的值
- 算法导论 第12章 二叉查找树
- 统计输入中所有单词出现的次数(使用二叉查找树实现:递归和非递归)
- 二叉查找树及平衡二叉查找树
- 【查找结构3】平衡二叉查找树 [AVL]