zoukankan      html  css  js  c++  java
  • 二叉查找树

      1 复习时,手画一棵查找树,亲自摸清查找树的各操作
      2 二叉查找树的定义
      3 一颗空树或该非空树满足:
      4 1,若有左子树,左子树的所有节点小于根节点
      5 2,若有右子树,右子树的所有节点大于根节点*/
      6 /*二叉查找树的一些性质
      7 1.查找某个关键字的比较次数最多是树的深度,
      8   模拟过程是从树根往下沿着
      9 某一路径走到叶子结点。查找性能取决于树的形态
     10 2.同一组数,会因插入的顺序不同,生成不同形态的查找树。
     11 ①按照有序序列插入,生成单支树,最坏情况时间复杂度是n/2
     12 ②最好情况和折半查找判定树相同,时间复杂度是log2(n)
     13 ③随机输入情况下,时间复杂度是log(n)
     14 3.中序遍历二叉树是个有序序列
     15 4,删除一个结点,操作较复杂:
     16    ①待删结点p是叶子结点,待删结点的父节点的相应孩子指针域修改成空
     17    ②待删结点p只有一棵子树,待删结点的父节点的相应孩子指针域
     18      修改成p->child
     19    ③待删结点有两棵子树,分两种情况:
     20      p的左孩子有右孩子,最右的孩子的数据代替p的数据,删除最右孩子
     21      p的左孩子没有右孩子,p的左孩子的数据代替p的数据,删除p的左孩子
     22      总而言之,就是把以p为树根的树的最大结点的值代替p的值,删除之
     23      最大结点其实是中序遍历时,p的直接前驱。
     24    ④删除结点是根结点时,要分开讨论,因为根结点没有父节点且会改变*T
     25 */
     26 /*详细笔记,关于查找2函数*/
     27 typedef struct node {
     28     int data;
     29     struct node *lchild, *rchild;
     30 }BSTNode, *BST;
     31 /*在二叉查找树中插入新结点*/
     32 /*1,如果树空,即第一次插入结点,树根是新结点
     33 2,树不空,新结点等于根,不必插入,返回错误信息
     34 新结点小于根,插入左子树;大于根,插入右子树*/
     35 Status BSTInsert(BST *T, int elem) {
     36     if (NULL == *T){
     37         *T = (BST)malloc(sizeof(BSTNode));
     38         (*T)->data = elem;
     39         (*T)->lchild = NULL;
     40         (*T)->rchild = NULL;
     41     }
     42     /*以下三个if条件语句是互斥执行的*/
     43     if (elem == (*T)->data)
     44         return error;
     45     else if (elem < (*T)->data)
     46         return BSTInsert(&(*T)->lchild, elem);
     47     else/*递归必须有return,否则编译器VS13会给出警告,
     48           请仔细思考递归*/
     49         return BSTInsert(&(*T)->rchild, elem);
     50 }
     51 /*调用插入函数,通过数组构建含有n个元素的查找树 */
     52 void InputData(BST *T, int *a, int n) {
     53     *T = NULL;
     54     for (int i = 0; i < n; ++i)
     55         BSTInsert(T, a[i]);
     56 }
     57 /*利用递归查找关键字key,查找成功返回指针,失败返回空指针*/
     58 BSTNode* SearchBST(BST T, int key) {
     59     if (NULL == T)
     60         return NULL;//递归结束条件(还可作为形参是空树的处理操作)
     61     else {
     62         if (key == T->data)
     63             return T;//根是目标元素,返回
     64         else if (key < T->data) {//小于根,找左子树
     65             return SearchBST(T->lchild, key);
     66             //【注意】必须要有return,否则编译器会给出警告
     67         }
     68         else {//大于根,找右子数
     69             return SearchBST(T->rchild, key);
     70         }/*注意:左子树和右子树只找了一个。普通二叉树的查找,左右子树
     71          都找了,注意二者判断条件的区别*/
     72     }
     73 }
     74 /*非递归在二叉排序树查找关键字key,查找成功返回指针,失败返回空指针*/
     75 BSTNode* SearchBST2(BST T, int key) {
     76     BSTNode *p = T;
     77     while (NULL != p && key != p->data) {
     78         if (key < p->data)
     79             p = p->lchild;
     80         else
     81             p = p->rchild;
     82     }
     83     return p;
     84 }
     85 /*删除一个结点,并接上她的左右子树*/
     86 Status DeleteNode(BST *T, int key) {
     87     BST p, q, maxchild, secmaxchild;
     88     if (NULL == *T)
     89         return error;
     90     p = *T;
     91     q = NULL;
     92     while (NULL != p && key != p->data) {
     93         q = p;
     94         if (key < p->data)
     95             p = p->lchild;
     96         else
     97             p = p->rchild;
     98     }
     99     if (p == *T) {
    100         printf("删除的是树根,需改变*T,未编,结束函数
    ");
    101         return error;
    102     }
    103     if (NULL == p)
    104         return error;
    105     else {
    106         /*待删结点p是叶子结点,q是其父节点*/
    107         if (NULL == p->lchild && NULL == p->rchild) {
    108             if (p == q->lchild)
    109                 q->lchild = NULL;
    110             if (p == q->rchild)
    111                 q->rchild = NULL;
    112             free(p); p = NULL;
    113         }
    114         /*待删结点p只有一棵子树,q直接将其删除*/
    115         else if (NULL != p->lchild && NULL == p->rchild) {
    116             if (p == q->lchild)
    117                 q->lchild = p->lchild;
    118             if (p == q->rchild)
    119                 q->rchild = p->lchild;
    120             free(p); p = NULL;
    121         }
    122         else if (NULL == p->lchild && NULL != p->rchild) {
    123             if (p == q->lchild)
    124                 q->lchild = p->rchild;
    125             if (p == q->rchild)
    126                 q->rchild = p->rchild;
    127             free(p); p = NULL;
    128         }
    129         /*待删结点p有两棵子树*/
    130         else if (NULL != p->lchild && NULL != p->rchild) {
    131             secmaxchild = p;
    132             maxchild = p->lchild;
    133             while (NULL != maxchild->rchild) {
    134                 secmaxchild = maxchild;
    135                 maxchild = maxchild->rchild;
    136             }
    137             if (maxchild != p->lchild) {
    138                 p->data = maxchild->data;
    139                 if (maxchild->lchild != NULL) {
    140                     secmaxchild->rchild = maxchild->lchild;
    141                 }
    142             }
    143             else {
    144                 p->data = maxchild->data;
    145                 p->lchild = maxchild->lchild;
    146             }
    147             free(maxchild); maxchild = NULL;
    148         }
    149         return ok;
    150     }
    151 }
  • 相关阅读:
    Analysis Services features supported by SQL Server editions
    Azure DevOps to Azure AppServices
    Power BI For Competition
    Win10开机“提示语音”以及”随机播放音乐”
    Azure DevOps
    Allow Only Ajax Requests For An Action In ASP.NET Core
    Mobile CI/CD 101
    Configure SSL for SharePoint 2013
    AWS Step Function Serverless Applications
    Cordova Upload Images using File Transfer Plugin and .Net core WebAPI
  • 原文地址:https://www.cnblogs.com/joyeehe/p/7941487.html
Copyright © 2011-2022 走看看