第39节 二叉排序树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pt_raspi_fresher/article/details/87823942

-------------------------------------资源来源于网络,仅供自学使用,如有侵权,联系我必删.

第一:

二分查找的回顾

二分查找的特点
   二分查找能够提高有序表中数据元素的查找速度
  二分查找的时间复杂度为O(log2n)
  二分查找是一种静态查找
二分查找的不足
  当查找表经常变化时 当查找表经常变化时,二分查找的整体性能急剧下降

第二:

二叉排序树

二叉排序树的定义
二叉排序树是一棵空树,或者  
• 若它的左子树不空,则左子树上所有结点的值均小于它的 ,则左子树上所有结点的值均小于它的根结点的值
• 若它的右子树不空,则右子树上所有结点的值均大于它的 ,则右子树上所有结点的值均大于它的根结点的值
• 它的左右子树也分别是二叉排序树

二叉排序树也是二叉树
  二叉排序树是一棵空树,或者 ,或者
• 若它的左子树不空,则左子树上所有结点的值均小于它的 ,则左子树上所有结点的值均小于它的根结点的值
• 若它的右子树不空,则右子树上所有结点的值均大于它的 ,则右子树上所有结点的值均大于它的根结点的值
• 它的左右子树也分别是二叉排序树

二叉排序树是特殊的二叉树,因此具有与二叉树相同的操作 ,因此具有与二叉树相同的操作!

二叉排序树的插入和删除操作
插入:
• 其插入操作总是在叶结点处进行
删除:
• 叶结点:直接删除 :直接删除
• 非叶结点:查找合适的替代者后删除 :查找合适的替代者后删除

二叉排序树的所有操作都必须保证其二叉排序性不变!

如何为删除操作查找合适的替代者
有一个孩子的结点:
• 用孩子结点代替原结点
有两个孩子的结点:
• 用中序遍历下的直接前驱替换原结点

二叉排序树的创建

基于BSTree.h 和 BSTree.c

#include <stdio.h>
#include <stdlib.h>
#include "BSTree.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

struct Node
{
    BSTreeNode header;
    char v;
};

void printf_data(BSTreeNode* node)
{
    if( node != NULL )
    {
        printf("%c", ((struct Node*)node)->v);
    }
}

int compare_key(BSKey* k1, BSKey* k2)
{
    return (int)k1 - (int)k2;
}

int main(int argc, char *argv[])
{
    BSTree* tree = BSTree_Create();
    
    struct Node n1 = {{(BSKey*)1, NULL, NULL}, 'A'};
    struct Node n2 = {{(BSKey*)2, NULL, NULL}, 'B'};
    struct Node n3 = {{(BSKey*)3, NULL, NULL}, 'C'};
    struct Node n4 = {{(BSKey*)4, NULL, NULL}, 'D'};
    struct Node n5 = {{(BSKey*)5, NULL, NULL}, 'E'};
    struct Node n6 = {{(BSKey*)6, NULL, NULL}, 'F'};
    
    BSTree_Insert(tree, (BSTreeNode*)&n4, compare_key);
    BSTree_Insert(tree, (BSTreeNode*)&n1, compare_key);
    BSTree_Insert(tree, (BSTreeNode*)&n3, compare_key);
    BSTree_Insert(tree, (BSTreeNode*)&n6, compare_key);
    BSTree_Insert(tree, (BSTreeNode*)&n2, compare_key);
    BSTree_Insert(tree, (BSTreeNode*)&n5, compare_key);
    
    printf("Height: %d\n", BSTree_Height(tree));
    printf("Degree: %d\n", BSTree_Degree(tree));
    printf("Count: %d\n", BSTree_Count(tree));
    printf("Search Key 5: %c\n", ((struct Node*)BSTree_Get(tree, (BSKey*)5, compare_key))->v);
    printf("Full Tree: \n");
    
    BSTree_Display(tree, printf_data, 4, '-');
    
    BSTree_Delete(tree, (BSKey*)4, compare_key);
    
    printf("After Delete Key 4: \n");
    printf("Height: %d\n", BSTree_Height(tree));
    printf("Degree: %d\n", BSTree_Degree(tree));
    printf("Count: %d\n", BSTree_Count(tree));
    printf("Full Tree: \n");
    
    BSTree_Display(tree, printf_data, 4, '-');
    
    BSTree_Clear(tree);
    
    printf("After Clear: \n");
    printf("Height: %d\n", BSTree_Height(tree));
    printf("Degree: %d\n", BSTree_Degree(tree));
    printf("Count: %d\n", BSTree_Count(tree));
    
    BSTree_Display(tree, printf_data, 4, '-');
    
    BSTree_Destroy(tree);
    
	return 0;
}

小结
二分查找仅适用于静态查找的情形
二叉排序树是从二分查找的过程总结而来的一种数据结构
二叉排序树的查找效率和二分查找相同
二叉排序树是特殊的二叉树其插入和删除操作必须保证其二叉排序的性质不变

猜你喜欢

转载自blog.csdn.net/pt_raspi_fresher/article/details/87823942
今日推荐