C语言实现二叉搜索树的创建、插入、删除和查找
2012-11-27 21:50
896 查看
代码如下。具体处理见注释。个人原创,非官方。
转载请注明出处。如果发现错误,欢迎大家给我留言。
转载请注明出处。如果发现错误,欢迎大家给我留言。
#include <stdio.h> #include <stdlib.h> #include <assert.h> #define TREE_TYPE int #define size 15 /**定义树形结构*/ typedef struct Tree { TREE_TYPE value; struct Tree *left; struct Tree *right; }Tree_node; /**根节点作为全局静态变量*/ static Tree_node *root; /**初始化树*/ void create_tree() { root = NULL; } /**向树种插入数据*/ Tree_node* insert(Tree_node *node,TREE_TYPE value) { if(node == NULL) { node = (Tree_node*)malloc(sizeof(Tree_node) * 1); node-> value = value; node -> left = NULL; node -> right = NULL; if(root == NULL) //如果为根节点 root = node; } else { if(value < node->value) //比该节点值小,写向左子树 node->left = insert(node->left,value); else //比该节点值大,写向右子树 node->right = insert(node->right,value); } return node; } /**显示树中所有节点内容*/ void show_all(Tree_node *node) { if(node != NULL) { if(node->left != NULL) show_all(node->left); printf("%d ",node->value); if(node->right != NULL); show_all(node->right); } } /**根据值查找某一特定节点*/ Tree_node* search(Tree_node *node,TREE_TYPE value) { Tree_node *result = NULL; if(node != NULL) { if(value == node->value) result = node; else if(value < node->value) result = search(node->left,value); else result = search(node->right,value); } return result; } /**找到某一值对应节点的父节点*/ Tree_node* find_parent(Tree_node *parent,TREE_TYPE value) { Tree_node *result = NULL; if(parent != NULL) { if(value < parent->value && parent->left != NULL) //比父节点值小,访问左子树 { if(value == parent->left->value) result = parent; else { result = find_parent(parent->left,value); if(result == NULL) result = find_parent(parent->right,value); } } if(value > parent->value && parent->right != NULL) //比父节点值大,访问右子树 { if(value == parent->right->value) result = parent; else { result = find_parent(parent->left,value); if(result == NULL) result = find_parent(parent->right,value); } } } return result; } void delete(TREE_TYPE value) { Tree_node *parent = find_parent(root,value); //找到待删节点的父节点 Tree_node *node = search(root,value); //找到待删节点 if(node == NULL) //待删节点不存在 printf("没有待删节点\n"); else //待删节点存在 { if(node->left == NULL && node->right == NULL) //如果待删节点是叶子节点 { // assert(parent != NULL); if(parent == NULL) //如果是根节点 root = NULL; else //其他节点 { if(node == parent->left) parent->left = NULL; else parent->right = NULL; } } else if(node->right == NULL) //如果待删节点只有左子树节点 { if(parent == NULL) //如果是根节点 root = node->left; else //其他节点 { if(node == parent->left) parent->left = node->left; else parent->right = node->left; } } else if(node->left == NULL) //如果待删节点只有右子树节点 { if(parent == NULL) //如果是根节点 root = node->right; else //其他节点 { if(node == parent->left) parent->left = node->right; else parent->right = node->right; } } else //如果带删节点左右子树节点都存在 { Tree_node *new_node = node->right; //需要找到右子树的最左那个 Tree_node *new_node_parent = NULL; while(new_node->left != NULL) { new_node_parent = new_node; new_node = new_node->left; } if(new_node != node->left) new_node->left = node->left; if(new_node != node->right) new_node->right = node->right; if(parent == NULL) root = new_node; else { if(node == parent->left) //如果带删节点是父节点的左节点 parent->left = new_node; else //如果待删节点是父节点的右节点 parent->right = new_node; } if(new_node_parent != NULL)//将原来的右子树最左节点删掉 new_node_parent->left = NULL; } } } int main() { /**初始化*/ create_tree(); /**插入*/ TREE_TYPE list[size] = {8,4,11,2,6,10,13,1,3,5,7,9,15,14,16}; int i; for(i = 0; i < size; i++) insert(root,list[i]); /**显示全部*/ show_all(root); putchar('\n'); /**根据值查找某节点*/ Tree_node *result = search(root,14); if(result != NULL) printf("To find %d,result is %d\n",14,result->value); else printf("Not find\n"); /**根据值查找其父节点*/ Tree_node *parent_result = find_parent(root,14); if(parent_result != NULL) printf("To find %d's parent,result is %d\n",14,parent_result->value); else printf("Cannot find %d's parent\n",14); /**删除*/ delete(14); //删除叶子节点 show_all(root); putchar('\n'); delete(13); //删除只有右子树的节点 show_all(root); putchar('\n'); delete(11); //删除只有左子树的节点 show_all(root); putchar('\n'); delete(4); //删除左右子树都有的节点 show_all(root); putchar('\n'); return 0; }
相关文章推荐
- 二叉搜索树的创建、插入、删除和查找的C语言实现
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 利用C语言实现二叉搜索树的遍历、查找、插入、删除
- C语言实现双链表基本操作(创建、查找、插入、删除)
- 平衡二叉树的C语言实现(创建、插入、查找、删除、旋转)【数据结构】
- Java 实现二叉搜索树的创建、查找、插入、删除结点
- C语言实现二叉查找树(搜索树)的创建,插入,查找,删除
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- c语言:顺序表的实现(一) 创建,插入,删除,查找,输出等基本操作实现
- (Swift 实现)二叉搜索树 —— 创建,最大,最小,查找,插入,删除,前驱,后继,中序遍历
- C语言实现链表的创建,初始化,插入,删除,查找
- c语言:单链表的实现(一) 创建,插入,删除,查找
- 【二叉树】二叉搜索树创建、插入、删除、查找等操作
- 【算法】【python实现】二叉搜索树插入、删除、查找
- 最小堆的插入、删除和创建的C语言实现
- C语言实现顺序表的初始化,插入,删除,查找
- java实现单链表的初始化,创建,删除,插入,查找,排序,同项删除,退出等功能
- 链表基本操作(创建,插入,查找,删除)-C语言
- C语言单链表的创建、插入、查找、删除、求长、排序、遍历
- 单链表基本操作的实现--创建、插入、查找、删除