陈姥姥是浙江大学的一名老师,她在mooc上的《数据结构》广受好评,我也专门进行了学习,课讲的确实很好,适合系统地学习数据结构。
真正意义上的,好大学没有围墙。
二叉搜索树(二叉排序树)
相关操作
也就是常用的五个函数。
查找
最大最小元素
插入
插入的操作和查询很像,将要插入的元素和根节点比较,如果大于走右子树,小于走左子树,直到插入到合适的位置。
代码实现
递归方法:
BinTree Insert( BinTree BST, ElementType X )
{
if( !BST )
{ /* 若原树为空,生成并返回一个结点的二叉搜索树 */
BST = (BinTree)malloc(sizeof(struct TNode));
BST->Data = X;
BST->Left = BST->Right = NULL;
}
else
{ /* 开始找要插入元素的位置 */
if( X < BST->Data )
BST->Left = Insert( BST->Left, X ); /*递归插入左子树*/
else if( X > BST->Data )
BST->Right = Insert( BST->Right, X ); /*递归插入右子树*/
/* else X已经存在,什么都不做 */
}
return BST;
}
二叉树的删除
删除操作稍微有点复杂,它分为三种情况。
1.删除的是叶节点
操作:直接删除
2.删除的节点只有一个孩子节点
操作:将被删除节点父指针指向被删除的节点的孩子节点。
3.被删除的节点有俩个孩子
用另一节点代替被删除节点:左子树的最大元素或者右子树的最小元素。
BinTree Delete( BinTree BST, ElementType X )
{
Position Tmp;
if( !BST )
printf("要删除的元素未找到");
else
{
if( X < BST->Data )
BST->Left = Delete( BST->Left, X ); /* 从左子树递归删除 */
else if( X > BST->Data )
BST->Right = Delete( BST->Right, X ); /* 从右子树递归删除 */
else { /* BST就是要删除的结点 */
/* 如果被删除结点有左右两个子结点 */
if( BST->Left && BST->Right )
{
/* 从右子树中找最小的元素填充删除结点 */
Tmp = FindMin( BST->Right );
BST->Data = Tmp->Data;
/* 从右子树中删除最小元素 */
BST->Right = Delete( BST->Right, BST->Data );
}
else
{ /* 被删除结点有一个或无子结点 */
Tmp = BST;
if( !BST->Left ) /* 只有右孩子或无子结点 */
BST = BST->Right;
else /* 只有左孩子 */
BST = BST->Left;
free( Tmp );
}
}
}
return BST;
}