首页 > 其他 > 详细

数据结构:3.4 二叉搜索树、平衡二叉树

时间:2021-02-05 23:27:50      阅读:31      评论:0      收藏:0      [点我收藏+]

二叉搜索树:

  特征:左子树键值 < 根结点键值 < 右子树键值

      左右子树也都是二叉搜索树

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

typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

操作集:

  查找:查找效率取决于树的高度

Position Find( BinTree BST, ElementType X ) {
    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 )
        while( BST->Left ) BST = BST->Left;
    return BST;
}

Position FindMax( BinTree BST ) {
    if( BST )
        while( BST->Right ) BST = BST->Right;
    return BST;
}

  插入:要先找到插入元素的位置

//插入
BinTree Insert( BinTree BST, ElementType X ) {
    if( !BST ) {       //若原树为空,则生成一个
        BST = 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 );
    } //若X已经存在,就不插入
    return BST;
}

  删除:有三种情况

//删除
BinTree Delete( BinTree BST, ElementType X ) {
    Position Tmp;
    if(!BST) printf("Not Found\n"); 
    else if( X < BST->Data )
        BST->Left = Delete(BST->Left,X);  //左子树递归删除
    else if( X > BST->Data )
        BST->Right = Delete(BST->Right,X);  //右子树递归删除
    else   //找到了要删除的结点
        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 if( !BST->Right )
                BST = BST->Left;
            free( Tmp );
        }
    return BST;
}

平衡二叉树

  特征:左右子树的高度差小于等于1

       节点数为 n 的平衡二叉树的最大高度为 O(log n)(向上取整)

  

  平衡二叉树的调整:插入结点后二叉树不平衡,RR旋转或LL旋转

 

数据结构:3.4 二叉搜索树、平衡二叉树

原文:https://www.cnblogs.com/Pio-GD/p/14379553.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!