首页 > 代码库 > 二叉搜索树
二叉搜索树
二叉搜索树:
动态查找
a.非空左子树的所有值小于其根接点值
b.非空右子树的所有值大于其根接点值
c.左、右子树均为二叉搜索树
Position Find( ElementType X, BinTree BST ):
从二叉搜索树BST中查找元素X,返回其所在结点的地址
Position FindMin( BinTree BST ):
从二叉搜索树BST中查找并返回 最小元素所在结点的地址
Position FindMax( BinTree BST ) :
从二叉搜索树BST中查找并返回 最大元素所在结点的地址
BinTree Insert( ElementType X, BinTree BST )
BinTree Delete( ElementType X, BinTree BST )
查找操作:
始于根结点,若树为空,返回NULL
非空,则与关键字X比较:
a. X小于根节点值,只需再左子树继续搜索
b. X大,则在右子树中搜索
c. 相等,返回此结点指针
递归解决
Position Find(ElementType X, BinTree BST){ if (!BST) return NULL;//若树为空则返回NULL if (X > BST->Data) return Find(X,BST->Right); else if(X < BST->Data) return Find(X,BST->Left); else //X = BST->Data return BST;}
迭代解决
Position IterFind( ElementType X, BinTree BST){ while(BST){ if (X > BST->Data) BST = BST->Right; else if (X < BST->Data) BST = BST->Left; else return BST; } return NULL;}
查找的效率决定于树的高度
寻最大和最小元素
最大 → 最右分支的最右端结点
最小 → 最左分支的最左端结点
Position FindMin( BinTree BST){ if (!BST) return NULL; else if (!BST->Left) return BST; else return FindMin(BST->Left);}
亦可以用迭代来解决
Position FindMax( BinTree BST)
Position FindMax( BinTree BST){ if(!BST) while (BST->Right) BST = BST->Right; return NULL;}
二叉搜索树的插入
插入、搜索、删除,我觉得这几个地方的递归是属于难点
BinTree Insert (ElementType X, BinTree BST){ if ( !BST ){ BST = malloc(sizeof(struct TreeNode)); BST->Data = http://www.mamicode.com/X;>
这种算法是不能插入重复数据的...可以看到..
然后return 的BST是根的指针
同样可以想,是一个一个Stack叠加...每一个Stack有其自己的BST
最终return的BST就是根的指针
已写代码验证
二叉搜索树的删除
a. 叶结点 → 直接删除,修改其父接点指针为NULL
b. 只有一个孩子 → 修改其父结点的指针指向要删除结点的孩子结点
c. 有左、右两颗子树 → 用另一结点替代被删除结点:右子树的最小元素 或者 左子树的最大元素
取右子树中的最小元素必定位于最左边端点,有的话也只会有一个儿子,右边儿子
然后因为右边的都是大于根接点的结点,所以最小的用来替换好也刚好就是搜索二叉树
而左子树的最大元素也同理,只会有一个儿子
这样就简化为 : 把结点替换掉之后再删除拿来替换的结点
替换的结点只有一个儿子/没有儿子,就简化为之前的a或者b状况
BinTree Delete(ElementType X, BinTree BST){ Position Tmp; if (!BST) printf("\nNode does not exist"); else if ( X < BST->Data) BST->Left = Delete(X,BST->Left); else if (X > BST->Right) BST->Right = Delete(X,BST->Right); else if ( BST->Right && BST->Left){ Tmp = FindMin(BST->Right); BST->Data = http://www.mamicode.com/Tmp->Data;>
这样一步步的return实际上是将要删除的节点啥再挂回原树
二叉搜索树