• 数据结构之二叉搜索树


    一:定义

      二叉搜索树也称为二叉排序树和二叉查找树(BST)
      二叉搜索树:一颗二叉树,可以为空,也可以不为空,满足以下性质
    1. 非空左子树的所有键值小于其根节点的键值。

    2. 非空右子树的所有键值大于其根节点的键值。

    3. 左、右子树都是二叉搜索树,且根节点不重合。

       

    二:基本操作

    查找

    • 查找最大值:查找最左边即为最大值。
    • 查找最小值:查找最右边即为最小值。

    插入

    • 注意:不能插入一样的节点

    删除【比较麻烦】

    • 若删除该节点是叶子节点,则直接删除,并再修改其父节点指针置为NULL
    • 若删除该节点是带有一个儿子节点,则将其父节点的指针指向要删除结点的孩子结点
    • 若删除该节点是带有左右二个二叉树,则用查找该节点的右子树的最小值,把当前节点设置为前面查找最小值,并删除下一个与该点的值一样的节点

    三:代码

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 typedef struct TreeNode* SearchTree;
      4 typedef struct TreeNode* Position;
      5 struct TreeNode
      6 {
      7     int data;
      8     SearchTree Left, Right;
      9 };
     10 //初始化
     11 SearchTree MakeEmpty(SearchTree T)
     12 {
     13     if (T!= NULL)
     14     {
     15         MakeEmpty(T->Left);
     16         MakeEmpty(T->Right);
     17         free(T);
     18     }
     19     return NULL;
     20 }
     21 //查找
     22 SearchTree Find(int x, SearchTree T)
     23 {
     24     if (T == NULL) return NULL;
     25     if (T->data < x)
     26     {
     27         return Find(x, T->Right);
     28     }
     29     else if (T->data > x)
     30     {
     31         return Find(x, T->Left);
     32     }
     33     else
     34     {
     35         return T;
     36     }
     37 }
     38 //查找最小值
     39 Position FindMin(SearchTree T)
     40 {
     41     if (T == NULL) return NULL;
     42     else if (T->Left == NULL) { return T; }
     43     else
     44     {
     45         return FindMin(T->Left);
     46     }
     47 }
     48 //查找最大值
     49 Position FindMax(SearchTree T)
     50 {
     51     if (T == NULL) return NULL;
     52     else if (T->Right == NULL)
     53     {
     54         return T;
     55     }
     56     else
     57     {
     58         return FindMax(T->Right);
     59     }
     60 }
     61 //插入
     62 SearchTree Insert(SearchTree T, int X)
     63 {
     64     if (T == NULL)
     65     {
     66         T = (SearchTree)malloc(sizeof(struct TreeNode));
     67         T->data = X;
     68         T->Left = T->Right = NULL;
     69     }
     70     else if (T->data > X)
     71     {
     72         T->Left = Insert(T->Left, X);
     73     }
     74     else if (T->data < X)
     75     {
     76         T->Right = Insert(T->Right, X);
     77     }
     78     return T;
     79 }
     80 //删除
     81 SearchTree Delete(SearchTree T, int X)
     82 {
     83     Position TmpCell;
     84     if (T == NULL)
     85     {
     86         return NULL;
     87     }
     88     else if (T->data > X)
     89     {
     90         T->Left = Delete(T->Left, X);
     91     }
     92     else if (T->data < X)
     93     {
     94         T->Right = Delete(T->Right, X);
     95     }
     96     else if (T->Left != NULL && T->Right != NULL) //被删节点存在左、右子树
     97     {
     98         TmpCell = FindMin(T->Right);
     99         T->data = TmpCell->data;
    100         T->Right = Delete(T->Right, T->data);
    101     }
    102     else //被删节点可能有左或者右子树 或者 是叶子节点
    103     {
    104         TmpCell = T;
    105         if (T->Left == NULL)
    106         {
    107             T = T->Right;
    108         }
    109         else if (T->Right == NULL)
    110         {
    111             T = T->Left;
    112         }
    113         free(TmpCell);
    114     }
    115     return T;
    116 }
    117 //中序遍历
    118 void InOrderTraversal(SearchTree T)
    119 {
    120     if (T)
    121     {
    122         InOrderTraversal(T->Left);
    123         printf("%5d", T->data);
    124         InOrderTraversal(T->Right);
    125     }
    126     //("
    ");
    127 
    128 }
    View Code
  • 相关阅读:
    linux screen工具
    nginx 启动重启脚本
    Docker入门
    时间管理定律
    贪婪算法
    指针与指针的地址
    双向链表(前插操作,删除操作)
    Trie树检索字符串
    函数调用
    字符串匹配算法
  • 原文地址:https://www.cnblogs.com/Yzengxin/p/13866205.html
Copyright © 2020-2023  润新知