实现
/* * 二叉查找树 * 定义: * 1.若左子树不空,则左子树上所有结点的值均小于它的根结点的值; * 2.若右子树不空,则右子树上所有结点的值均大于它的根结点的值; * 3.左、右子树分别为二叉查找树; * 4.没有键值相等的结点; */ #include <stdio.h> #include <stdlib.h> #define Error(Str) FatalError(Str); #define FatalError(Str) fprintf(stderr, "%s\n", Str), exit(1) #define GetArrayLen(array,len){len = (sizeof(array) / sizeof(array[0]));} struct TreeNode; typedef int ElementType; typedef struct TreeNode *Position; typedef struct TreeNode *SearchTree; struct TreeNode { //int depth; ElementType Element; SearchTree Left; SearchTree Right; }; SearchTree createTree(); SearchTree MakeEmpty(SearchTree T); /* * 创建一棵树 */ SearchTree createTree() { SearchTree T; T = malloc(sizeof(struct TreeNode)); if(T == NULL) FatalError("内存申请失败!"); T->Left = NULL; T->Right = NULL; return T; } /* * 插入 */ SearchTree Insert(ElementType X, SearchTree T) { if(T == NULL) { //创建一个单节点的树 T = malloc(sizeof(struct TreeNode)); if(T == NULL) FatalError("内存申请失败!"); else { T->Element = X; T->Left = T->Right = NULL; } } else if(X < T->Element) T->Left = Insert(X, T->Left); else if(X > T->Element) T->Right = Insert(X, T->Right); return T; } /* * 置空一棵树 */ SearchTree MakeEmpty(SearchTree T) { if(T != NULL) { MakeEmpty(T->Left); MakeEmpty(T->Right); free(T); } return NULL; } /* * 查找 */ Position Find(ElementType X, SearchTree T) { if(T == NULL) return NULL; if(X < T->Element) return Find(X, T->Left); else if(X > T->Element) return Find(X, T->Right); else return T; } /* * 查找最小节点(递归实现,用相同方法查找最大节点时只需将分支朝向右子树即可) */ Position FindMin(SearchTree T) { if(T == NULL) return NULL; else if(T->Left == NULL) return T; else return FindMin(T->Left); } /* * 查找最大节点(非递归) */ Position FindMax(SearchTree T) { if(T != NULL) while(T->Right != NULL) T = T->Right; return T; } /* * 删除 */ SearchTree Delete(ElementType X, SearchTree T) { Position TmpCell; if(T == NULL) { Error("元素没有找到,亲!"); } else if(X < T->Element)//要删除的数据小于该节点的元素值,递归调用左子树 T->Left = Delete(X, T->Left); else if(X > T->Element)//要删除的数据大于该节点的元素值,递归调用右子树 T->Right = Delete(X, T->Right); else//找到要删除的元素 if(T->Left && T->Right)//该节点拥有两个子树 { //替换右子树中最小的节点 TmpCell = FindMin(T->Right); T->Element = TmpCell->Element; T->Right = Delete(T->Element, T->Right); } else//1个或0个子树 { TmpCell = T; if(T->Left == NULL) T = T->Right; else if(T->Right == NULL) T = T->Left; free(TmpCell); } return T; } /* * 二叉查找树打印 */ SearchTree printfTree(SearchTree T,int dep, int flag) { if(T == NULL) return NULL;//递归出口 else { dep++; int i; for(i=1; i<dep; i++) printf("----"); if(1 == flag) printf("%d--left--dep:%d\n", T->Element, dep); else if(2 == flag) printf("%d--right--dep:%d\n", T->Element, dep); else printf("%d--root--dep:%d\n", T->Element, dep); printfTree(T->Left, dep, 1); printfTree(T->Right, dep, 2); } } void main() { //创建一个二叉查找树 int arr[100]; int len,i; //GetArrayLen(arr, len); SearchTree tree = NULL; //主循环 char input[10]; int list_val=0,key; while(1) { //参数接收 int par_key=1,par3=0; while(1) { if(1 == par_key) scanf("%s", &input); else if(2 == par_key) scanf("%d", &list_val); else if(3 == par_key) scanf("%d", &par3); else break; char c=getchar(); if(c=='\n') break; par_key++; } if(strcmp(input , "insert") == 0) { //结点新增 tree = Insert(list_val, tree); printf("插入完成,新插入的值为:%d,下面是目前的二叉查找树,皮卡!\n", list_val); printfTree(tree,0, 0); } else if(strcmp(input , "find") == 0) { //结点查找 } else if(strcmp(input , "delete") == 0) { //结点删除 Delete(list_val, tree); printf("节点删除完成,要删除的值为:%d,下面是目前的二叉查找树,皮卡!%d\n", list_val,tree->Element); printfTree(tree,0, 0); } else if(strcmp(input, "edit") == 0) { //结节修改 } else if(strcmp(input , "traverse") == 0) { //遍历 printfTree(tree,0, 0); } else if(strcmp(input , "exit") == 0) break; } }
2.运行结果:
[root@iZ28mhfkaunZ tree]# ./searchtree insert 16 插入完成,新插入的值为:16,下面是目前的二叉查找树,皮卡! 16--root--dep:1 iinsexi exit [root@iZ28mhfkaunZ tree]# ./searchtree insert 15 插入完成,新插入的值为:15,下面是目前的二叉查找树,皮卡! 15--root--dep:1 insert 19 插入完成,新插入的值为:19,下面是目前的二叉查找树,皮卡! 15--root--dep:1 ----19--right--dep:2 insert 17 插入完成,新插入的值为:17,下面是目前的二叉查找树,皮卡! 15--root--dep:1 ----19--right--dep:2 --------17--left--dep:3 delete 19 节点删除完成,要删除的值为:19,下面是目前的二叉查找树,皮卡!15 15--root--dep:1 ----17--right--dep:2
3.