二叉查找树的查找、插入和删除
来源:互联网 发布:慧莫森软件科技 编辑:程序博客网 时间:2024/06/05 23:51
【边学边记】之二叉树相关算法
关于二叉树的基础知识可参考上一篇文章《二叉树基础知识》
二叉树节点声明
typedef struct TreeNode *PtrToNode;typedef struct PtrToNode Tree;struct TreeNode{ElementType ELement;Tree Left;Tree Right;};
二叉查找树的Find操作,一般需要返回指向树T中具有关键字X的节点的指针,如果这样的节点不存在则返回NULL。
代码如下:
PositionFind(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;}
FindMin和FindMax分别返回树中最小元的位置和最大元的位置
对二叉查找树的FindMin递归实现:
PositionFindMin(SearchTree T){ if(T == NUll) return NULL; else if(T->Left == NUll) return T; else return FindMin(T->Left);}
对二叉查找树的FindMax的非递归实现
PositionFindMax(SearchTree T){ if(T != NULL) while(T->Right != NULL) T = T->Right; return T;}
二叉查找树的插入过程如下:
1.若当前的二叉查找树为空,则插入的元素为根节点,
2.若插入的元素值小于根节点值,则将元素插入到左子树中,
3.若插入的元素值不小于根节点值,则将元素插入到右子树中。
插入元素的二叉查找树的例程
SearchTreeInsert(ELementType X,SearchTree T){if(T==NULL){ /*Create and return a one-node tree*/ T=malloc(sizeof(struct TreeNode)); if(T==NULL) FatalError("Out of space!!!"); else { T->ELement = X; T->Left = T->Right = NULL; }}elseif(X<T->Element) T->Left = Insert(X,T->Left);elseif(X>T->Element) T->Right = Insert(X,T->Right);/*Else X is in the tree already;we will do nothing*/return T;/*Do not forget this line!!*/
二叉查找树的删除,分三种情况进行处理:
1.如果节点为叶子节点,直接删除该节点,再修改其父节点的指针(注意分是根节点和不是根节点),如图a。
2.如果节点有一个儿子,则该节点可以在其父节点调整指针绕过该节点后被删除;(注意分是根节点和不是根节点);如图b。
3.复杂的情况是处理具有两个儿子的节点。一般的删除策略是用其右子树的最小的数据(很容易找到)代替该节点并递归地删除那个节点(现在它是空的)。因为右子树中的最小的节点不可能有左儿子,所以第二次Delete(删除)要容易。如图c
二叉查找树的删除例程
SearchTreeDelete(ElementType X,SearchTree T){ Position TmpCell; if(T == NULL) Error("Element not found"); else if(X < T->Element) /*Go left*/ T->Left = Delete(X,T->Left); else if(X > T-ELement) /*Go Right*/ T->Right = Delete(X,T->Right) else /*Found element to be deleted*/ if(T->Left && T->Right) /*Two chldren*/ { /* Replace with smallest in right subtree*/ TmpCell = FindMin(T->Left); T->Element = TmpCell->ELement; T->Right = Delete(T->ELement,T->Right); } else /*One or zero children*/ { TmpCell = T; if(T->Left == NULL) /*Also handles 0 children*/ T = T->Right; else if(T->Right == NULL) T = T->Left; free(TmpCell); } return T;}
0 0
- 二叉查找树节点的查找、插入和删除
- 二叉查找树的查找、插入和删除
- 二叉查找树的插入,删除,查找
- 二叉查找树的插入,删除,查找
- 二叉查找树的插入,删除,查找
- 二叉查找树的插入和删除详解
- 二叉查找树的插入和删除简单实现
- 二叉搜索树(BST)的创建、插入、查找和删除
- 二叉搜索树的定义、查找、插入和删除
- 二叉查找树的插入和删除详解
- 二叉查找树的插入和删除详解
- 搜索二叉树的查找、插入和删除
- 二叉搜索树的定义、查找、插入和删除
- 二叉查找树的插入和删除详解
- 二叉搜索树的查找、插入、删除
- 二叉搜索树的插入,查找,删除
- 二叉查找树的插入与删除
- 二叉查找树--插入、删除、查找
- Java 中的动态代理
- 高德地图key码7,已解决
- js小结
- MATLAB编程思想
- 线程池 Executors
- 二叉查找树的查找、插入和删除
- synchronized同步方法2
- virtualenv 使用
- 基于docker compose的应用服务部署
- Android jni(2)
- HBuilder封装APP
- 使用积分图进行法线估计
- Android启动流程分析之二:内核的引导
- 《Java虚拟机原理图解》 1.2.2、Class文件中的常量池详解(上)