zoukankan      html  css  js  c++  java
  • 二叉搜索树(Binary Search Tree)

    二叉搜索树(BST,Binary Search Tree),也称二叉排序树二叉查找树

    二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质:

    • 非空左子树所有键值小于其根结点的键值;
    • 非空右子树所有键值大于其根结点的键值;
    • 左右子树都是二叉搜索树

    Wiki中的定义

    • The left subtree of a node contains only nodes with keys less than the node's key.
    • The right subtree of a node contains only nodes with keys greater than the node's key.
    • The left and right subtrees each must also be a binary search tree.
    • Each node can have up to two successor nodes.
    • There must be no duplicate nodes.
    • A unique path exists from the root to every other node.

    二叉搜索树操作的特别函数:

    Position Find(ElementType X,BinTree BST):从二叉搜索树BST查找元素X,返回其所在结点的地址;

    Position FindMin(BinTree BST):从二叉搜索树BST中查找并返回最小元素所在结点的地址;

    Position FindMax(BinTree BST):从二叉搜索树BST中查找并返回最大元素所在结点的地址;

    BinTree Insert(ElementType X,BinTree BST):把元素X结点插入到二叉搜索树BST中;

    BinTree Delete(ElementType X,BinTree BST):从二叉搜索树BST中删除元素X结点;


    【二叉搜索树的查找操作:Find】

    1、查找从根结点开始,如果树为空,返回NULL;

    2、若搜索树非空,则根结点关键字和X进行比较,并进行不同处理:

    • 如果X小于根结点的键值,只需在左子树继续搜索
    • 如果X大于根结点的键值,只需在右子树继续搜索
    • 若两者比较结果是相等搜索完成,返回指向此结点的指针;

    递归查找操作:

     1 Position BST_Find(ElementType X, BinTree BST)
     2 {
     3     if(BST == NULL)
     4         return NULL;
     5 
     6     if(X > BST->Data)
     7         return BST_Find(X, BST->Right);
     8     else if(X < BST->Data)
     9         return BST_Find(X, BST->Left);
    10     else
    11         return BST;
    12 }

    非递归查找操作:

     1 Postion BST_Find_ext(ElementType X, BinTree BST)
     2 {
     3     while(BST != NULL)
     4     {
     5         if(X > BST->Data)
     6             BST = BST->Right;
     7         else if(X < BST->Data)
     8             BST = BST->Left;
     9         else
    10             return BST;
    11     }
    12     return NULL;
    13 }

    【二叉搜索树查找最大元素FindMax和最小元素FindMin】

    最大元素一定是在树的最右分支端结点上;

    最小元素一定是在树的最左分支端结点上;

    递归查找Min和Max:

     1 Position BST_FindMin(BinTree BST)
     2 {
     3     if(BST == NULL)
     4         return NULL;
     5     else if(BST->Left == NULL)
     6         return BST;
     7     else
     8         return BST_FindMin(BST->Left);
     9 }
    10 
    11 Position BST_FindMax(BinTree BST)
    12 {
    13     if(BST == NULL)
    14         return NULL;
    15     else if(BST->Right == NULL)
    16         return BST;
    17     else
    18         return BST_FindMax(BST->Right);
    19 }


    非递归查找Min和Max:

     1 Position BST_FindMin_ext(BinTree BST)
     2 {
     3     if(BST != NULL)
     4     {
     5         while(BST->Left != NULL)
     6             BST = BST->Left;
     7     }
     8     return BST;
     9 }
    10 
    11 Position BST_FindMax_ext(BinTree BST)
    12 {
    13     if(BST != NULL)
    14     {
    15         while(BST->Right != NULL)
    16             BST = BST->Right;
    17     }
    18     return BST;
    19 }

    【二叉搜索树的插入操作:Insert】

     1 BinTree BST_Insert(ElementType X, BinTree BST)
     2 {
     3     if(BST == NULL)
     4     {
     5         // 若原树为空,生成并返回一个结点的二叉搜索树
     6         BST = malloc(sizeof(struct TreeNode));
     7         BST->Data  = X;
     8         BST->Left  = NULL;
     9         BST->Right = NULL;
    10     }
    11     else
    12     {
    13         // 开始找要插入元素的位置
    14         if(X < BST->Data)
    15             BST->Left = BST_Insert(X, BST->Left); // 递归插入左子树
    16         else if(X > BST->Data)
    17             BST->Right = BST_Insert(X, BST->Right); // 递归插入右子树
    18         // else X已经存在,什么都不做
    19     }
    20     return BST;
    21 }

    【二叉搜索树的删除操作:Delete】

     二叉搜索树的删除操作需要考虑三种情况:

    • 要删除的是叶结点直接删除并修改其父结点指针置为NULL
    • 要删除的结点只有一个孩子结点:将父结点的指针指向要删除结点的孩子结点
    • 要删除的结点有左右两棵子树:用另一个结点替代被删除结点右子树的最小元素 或者 左子树的最大元素
     1 BinTree BST_Delete(ElementType X, BinTree BST)
     2 {
     3     Position Tmp;
     4 
     5     if(BST == NULL)
     6     {
     7         printf("warning: xxx
    "); // 未找到要删除的元素
     8     }
     9     else if(X < BST->Data)
    10     {
    11         BST->Left = BST_Delete(X, BST->Left); // 左子树递归删除
    12     }
    13     else if(X > BST->Data)
    14     {
    15         BST->Right = BST_Delete(X, BST->Right); // 右子树递归删除
    16     }
    17     else
    18     {
    19         // 被删除结点有左右两个子结点
    20         if(BST->Left != NULL && BST->Right != NULL)
    21         {
    22             // 在右子树中找到最小的元素填充删除结点
    23             Tmp = BST_FindMin(BST->Right);
    24             BST->Data = Tmp->Data;
    25             // 在删除结点的右子树中删除最小元素
    26             BST->Right = BST_Delete(BST->Data, BST->Right);
    27         }
    28         else // 被删除结点有一个或无子结点
    29         {
    30             Tmp = BST;
    31             if(BST->Left == NULL) // 有右孩子或者无子结点
    32                 BST = BST->Right;
    33             else if(BST->Right == NULL) // 有左孩子或者无子结点
    34                 BST = BST->Left;
    35             free(Tmp);
    36         }
    37     }
    38     return BST;
    39 }

    Wiki链接:

    Binary_search_tree :http://en.wikipedia.org/wiki/Binary_search_tree

  • 相关阅读:
    移动端拖拽
    原生js增加,移除类名
    js自执行函数
    页面加载初始化方法
    writing-mode,文字竖直书写,字符之间距离,单词之间距离
    滚动鼠标达到一点范围时的跑秒效果,从0开始一直加在规定时间内加到最大值
    haley解决中文字段名称字数不同时两端对齐的问题
    常用的一些css实现的小效果,比如三角形,小三角,阴影等
    html几个比较常用的颜色名称
    Spring--通过注解来配置bean
  • 原文地址:https://www.cnblogs.com/utank/p/4277072.html
Copyright © 2011-2022 走看看