二叉查找树
二叉查找树,树中每个结点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树种所有关键字值大于X的关键字值。
代码如下:
typedef struct TreeNode *SearchTree; typedef struct TreeNode *Position; typedef int ElementType; struct TreeNode { ElementType element; SearchTree left; SearchTree right; };
对于树的操作中,最复杂的要数删除操作,具体分三种情况:1.要删除的结点是叶子节点;2要删除的结点有1个儿子;3.要删除的结点有2个儿子。具体实现看代码:
Position Find(ElementType X,SearchTree T) { if(T==NULL) return T; if(X<T->element) return Find(X,T->left);//通过层层return,最终得到的返回值就是被找到的那个元素结点。 else if(X>T->element) return Find(X,T->right); else return T; } Position FindMin(SearchTree T) { if(T==NULL || T->left==NULL) return T; else return FindMin(T->left);//往左找到底 } Position FindMax(SearchTree T) { if(T==NULL || T->right==NULL) return T; else return FindMax(T->right);//往右找到底 } SearchTree Insert(ElementType X,SearchTree T) { if(T==NULL)//找到没办法往下找的时候,就在这个地方插入值 { T = (SearchTree)malloc(sizeof(struct TreeNode)); if(T == NULL) { printf("out of place"); } else { T->element = X; T->left = NULL; 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 Delete(ElementType X,SearchTree T) { Position tmp; if(T == NULL) printf("element is not found!"); else if(X < T->element) T->left = Delete(X,T->left); else if(X > T->element) T->right = Delete(X,T->right); else//走到这一步说明当前这个T就是我们要删除的那个结点 { if(T->left&&T->right)//两个儿子,找右子数中最小的数,它肯定比左子树的所有数都大,又比右子数的所有数都小。或者找左子树的最大值,意思是一样的。 { tmp = FindMin(T->right); T->element = tmp->element;//将找到的右子数最小值放在T中,然后删除那个最小值得结点。 T->right = Delete(T->element,T->right); } else//如果没儿子或者有1个儿子 { tmp = T; if(T->left == NULL)//处理了只有右儿子或没儿子的情况 T = T->right; else if(T->right == NULL)//处理只有左儿子的情况 T = T->left; free(tmp); } } return T; }

浙公网安备 33010602011771号