第十三周项目四

/*  

*Copyright  (c)2017,烟台大学计算机与控制工程学院      

*All rights reservrd.           

*作者:张思琦

*完成时间:2017年12月7日      

*版本号:v1.0      

*问题描述:运行并本周视频中所讲过的算法,观察结果并领会算法。

        认真阅读并验证平衡二叉树相关算法。 
(1)由整数序列{43,52,75,24,10,38,67,55,63,60}构造AVL树; 
(2)输出用括号法表示的AVL树; 
(3)查找关键字55; 
(4)分别删除43和55,输出删除后用括号法表示的二叉排序树。


一、代码如下:

#include <stdio.h>  
  1. #include <malloc.h>   
  2. typedef int KeyType;                    //定义关键字类型   
  3. typedef char InfoType;  
  4. typedef struct node                     //记录类型   
  5. {  
  6.     KeyType key;                        //关键字项   
  7.     int bf;                             //平衡因子   
  8.     InfoType data;                      //其他数据域   
  9.     struct node *lchild,*rchild;        //左右孩子指针   
  10. } BSTNode;  
  11. void LeftProcess(BSTNode *&p,int &taller)  
  12. //对以指针p所指结点为根的二叉树作左平衡旋转处理,本算法结束时,指针p指向新的根结点   
  13. {  
  14.     BSTNode *p1,*p2;  
  15.     if (p->bf==0)           //原本左、右子树等高,现因左子树增高而使树增高   
  16.     {  
  17.         p->bf=1;  
  18.         taller=1;  
  19.     }  
  20.     else if (p->bf==-1)     //原本右子树比左子树高,现左、右子树等高   
  21.     {  
  22.         p->bf=0;  
  23.         taller=0;  
  24.     }  
  25.     else                    //原本左子树比右子树高,需作左子树的平衡处理   
  26.     {  
  27.         p1=p->lchild;       //p指向*p的左子树根结点   
  28.         if (p1->bf==1)      //新结点插入在*b的左孩子的左子树上,要作LL调整   
  29.         {  
  30.             p->lchild=p1->rchild;  
  31.             p1->rchild=p;  
  32.             p->bf=p1->bf=0;  
  33.             p=p1;  
  34.         }  
  35.         else if (p1->bf==-1)    //新结点插入在*b的左孩子的右子树上,要作LR调整   
  36.         {  
  37.             p2=p1->rchild;  
  38.             p1->rchild=p2->lchild;  
  39.             p2->lchild=p1;  
  40.             p->lchild=p2->rchild;  
  41.             p2->rchild=p;  
  42.             if (p2->bf==0)          //新结点插在*p2处作为叶子结点的情况   
  43.                 p->bf=p1->bf=0;  
  44.             else if (p2->bf==1)     //新结点插在*p2的左子树上的情况   
  45.             {  
  46.                 p1->bf=0;  
  47.                 p->bf=-1;  
  48.             }  
  49.             else                    //新结点插在*p2的右子树上的情况   
  50.             {  
  51.                 p1->bf=1;  
  52.                 p->bf=0;  
  53.             }  
  54.             p=p2;  
  55.             p->bf=0;            //仍将p指向新的根结点,并置其bf值为0   
  56.         }  
  57.         taller=0;  
  58.     }  
  59. }  
  60. void RightProcess(BSTNode *&p,int &taller)  
  61. //对以指针p所指结点为根的二叉树作右平衡旋转处理,本算法结束时,指针p指向新的根结点   
  62. {  
  63.     BSTNode *p1,*p2;  
  64.     if (p->bf==0)           //原本左、右子树等高,现因右子树增高而使树增高   
  65.     {  
  66.         p->bf=-1;  
  67.         taller=1;  
  68.     }  
  69.     else if (p->bf==1)      //原本左子树比右子树高,现左、右子树等高   
  70.     {  
  71.         p->bf=0;  
  72.         taller=0;  
  73.     }  
  74.     else                    //原本右子树比左子树高,需作右子树的平衡处理   
  75.     {  
  76.         p1=p->rchild;       //p指向*p的右子树根结点   
  77.         if (p1->bf==-1)     //新结点插入在*b的右孩子的右子树上,要作RR调整   
  78.         {  
  79.             p->rchild=p1->lchild;  
  80.             p1->lchild=p;  
  81.             p->bf=p1->bf=0;  
  82.             p=p1;  
  83.         }  
  84.         else if (p1->bf==1) //新结点插入在*p的右孩子的左子树上,要作RL调整   
  85.         {  
  86.             p2=p1->lchild;  
  87.             p1->lchild=p2->rchild;  
  88.             p2->rchild=p1;  
  89.             p->rchild=p2->lchild;  
  90.             p2->lchild=p;  
  91.             if (p2->bf==0)          //新结点插在*p2处作为叶子结点的情况   
  92.                 p->bf=p1->bf=0;  
  93.             else if (p2->bf==-1)    //新结点插在*p2的右子树上的情况   
  94.             {  
  95.                 p1->bf=0;  
  96.                 p->bf=1;  
  97.             }  
  98.             else                    //新结点插在*p2的左子树上的情况   
  99.             {  
  100.                 p1->bf=-1;  
  101.                 p->bf=0;  
  102.             }  
  103.             p=p2;  
  104.             p->bf=0;            //仍将p指向新的根结点,并置其bf值为0   
  105.         }  
  106.         taller=0;  
  107.     }  
  108. }  
  109. int InsertAVL(BSTNode *&b,KeyType e,int &taller)  
  110. /*若在平衡的二叉排序树b中不存在和e有相同关键字的结点,则插入一个 
  111.   数据元素为e的新结点,并返回1,否则返回0。若因插入而使二叉排序树 
  112.   失去平衡,则作平衡旋转处理,布尔变量taller反映b长高与否*/  
  113. {  
  114.     if(b==NULL)         //原为空树,插入新结点,树“长高”,置taller为1   
  115.     {  
  116.         b=(BSTNode *)malloc(sizeof(BSTNode));  
  117.         b->key=e;  
  118.         b->lchild=b->rchild=NULL;  
  119.         b->bf=0;  
  120.         taller=1;  
  121.     }  
  122.     else  
  123.     {  
  124.         if (e==b->key)              //树中已存在和e有相同关键字的结点则不再插入   
  125.         {  
  126.             taller=0;  
  127.             return 0;  
  128.         }  
  129.         if (e<b->key)               //应继续在*b的左子树中进行搜索   
  130.         {  
  131.             if ((InsertAVL(b->lchild,e,taller))==0) //未插入   
  132.                 return 0;  
  133.             if (taller==1)          //已插入到*b的左子树中且左子树“长高”   
  134.                 LeftProcess(b,taller);  
  135.         }  
  136.         else                        //应继续在*b的右子树中进行搜索   
  137.         {  
  138.             if ((InsertAVL(b->rchild,e,taller))==0) //未插入   
  139.                 return 0;  
  140.             if (taller==1)          //已插入到b的右子树且右子树“长高”   
  141.                 RightProcess(b,taller);  
  142.         }  
  143.     }  
  144.     return 1;  
  145. }  
  146. void DispBSTree(BSTNode *b) //以括号表示法输出AVL   
  147. {  
  148.     if (b!=NULL)  
  149.     {  
  150.         printf("%d",b->key);  
  151.         if (b->lchild!=NULL || b->rchild!=NULL)  
  152.         {  
  153.             printf("(");  
  154.             DispBSTree(b->lchild);  
  155.             if (b->rchild!=NULL) printf(",");  
  156.             DispBSTree(b->rchild);  
  157.             printf(")");  
  158.         }  
  159.     }  
  160. }  
  161. void LeftProcess1(BSTNode *&p,int &taller)  //在删除结点时进行左处理   
  162. {  
  163.     BSTNode *p1,*p2;  
  164.     if (p->bf==1)  
  165.     {  
  166.         p->bf=0;  
  167.         taller=1;  
  168.     }  
  169.     else if (p->bf==0)  
  170.     {  
  171.         p->bf=-1;  
  172.         taller=0;  
  173.     }  
  174.     else        //p->bf=-1   
  175.     {  
  176.         p1=p->rchild;  
  177.         if (p1->bf==0)          //需作RR调整   
  178.         {  
  179.             p->rchild=p1->lchild;  
  180.             p1->lchild=p;  
  181.             p1->bf=1;  
  182.             p->bf=-1;  
  183.             p=p1;  
  184.             taller=0;  
  185.         }  
  186.         else if (p1->bf==-1)    //需作RR调整   
  187.         {  
  188.             p->rchild=p1->lchild;  
  189.             p1->lchild=p;  
  190.             p->bf=p1->bf=0;  
  191.             p=p1;  
  192.             taller=1;  
  193.         }  
  194.         else                    //需作RL调整   
  195.         {  
  196.             p2=p1->lchild;  
  197.             p1->lchild=p2->rchild;  
  198.             p2->rchild=p1;  
  199.             p->rchild=p2->lchild;  
  200.             p2->lchild=p;  
  201.             if (p2->bf==0)  
  202.             {  
  203.                 p->bf=0;  
  204.                 p1->bf=0;  
  205.             }  
  206.             else if (p2->bf==-1)  
  207.             {  
  208.                 p->bf=1;  
  209.                 p1->bf=0;  
  210.             }  
  211.             else  
  212.             {  
  213.                 p->bf=0;  
  214.                 p1->bf=-1;  
  215.             }  
  216.             p2->bf=0;  
  217.             p=p2;  
  218.             taller=1;  
  219.         }  
  220.     }  
  221. }  
  222. void RightProcess1(BSTNode *&p,int &taller) //在删除结点时进行右处理   
  223. {  
  224.     BSTNode *p1,*p2;  
  225.     if (p->bf==-1)  
  226.     {  
  227.         p->bf=0;  
  228.         taller=-1;  
  229.     }  
  230.     else if (p->bf==0)  
  231.     {  
  232.         p->bf=1;  
  233.         taller=0;  
  234.     }  
  235.     else        //p->bf=1   
  236.     {  
  237.         p1=p->lchild;  
  238.         if (p1->bf==0)          //需作LL调整   
  239.         {  
  240.             p->lchild=p1->rchild;  
  241.             p1->rchild=p;  
  242.             p1->bf=-1;  
  243.             p->bf=1;  
  244.             p=p1;  
  245.             taller=0;  
  246.         }  
  247.         else if (p1->bf==1)     //需作LL调整   
  248.         {  
  249.             p->lchild=p1->rchild;  
  250.             p1->rchild=p;  
  251.             p->bf=p1->bf=0;  
  252.             p=p1;  
  253.             taller=1;  
  254.         }  
  255.         else                    //需作LR调整   
  256.         {  
  257.             p2=p1->rchild;  
  258.             p1->rchild=p2->lchild;  
  259.             p2->lchild=p1;  
  260.             p->lchild=p2->rchild;  
  261.             p2->rchild=p;  
  262.             if (p2->bf==0)  
  263.             {  
  264.                 p->bf=0;  
  265.                 p1->bf=0;  
  266.             }  
  267.             else if (p2->bf==1)  
  268.             {  
  269.                 p->bf=-1;  
  270.                 p1->bf=0;  
  271.             }  
  272.             else  
  273.             {  
  274.                 p->bf=0;  
  275.                 p1->bf=1;  
  276.             }  
  277.             p2->bf=0;  
  278.             p=p2;  
  279.             taller=1;  
  280.         }  
  281.     }  
  282. }  
  283. void Delete2(BSTNode *q,BSTNode *&r,int &taller)  
  284. //由DeleteAVL()调用,用于处理被删结点左右子树均不空的情况   
  285. {  
  286.     if (r->rchild==NULL)  
  287.     {  
  288.         q->key=r->key;  
  289.         q=r;  
  290.         r=r->lchild;  
  291.         free(q);  
  292.         taller=1;  
  293.     }  
  294.     else  
  295.     {  
  296.         Delete2(q,r->rchild,taller);  
  297.         if (taller==1)  
  298.             RightProcess1(r,taller);  
  299.     }  
  300. }  
  301. int DeleteAVL(BSTNode *&p,KeyType x,int &taller) //在AVL树p中删除关键字为x的结点   
  302. {  
  303.     int k;  
  304.     BSTNode *q;  
  305.     if (p==NULL)  
  306.         return 0;  
  307.     else if (x<p->key)  
  308.     {  
  309.         k=DeleteAVL(p->lchild,x,taller);  
  310.         if (taller==1)  
  311.             LeftProcess1(p,taller);  
  312.         return k;  
  313.     }  
  314.     else if (x>p->key)  
  315.     {  
  316.         k=DeleteAVL(p->rchild,x,taller);  
  317.         if (taller==1)  
  318.             RightProcess1(p,taller);  
  319.         return k;  
  320.     }  
  321.     else            //找到了关键字为x的结点,由p指向它   
  322.     {  
  323.         q=p;  
  324.         if (p->rchild==NULL)        //被删结点右子树为空   
  325.         {  
  326.             p=p->lchild;  
  327.             free(q);  
  328.             taller=1;  
  329.         }  
  330.         else if (p->lchild==NULL)   //被删结点左子树为空   
  331.         {  
  332.             p=p->rchild;  
  333.             free(q);  
  334.             taller=1;  
  335.         }  
  336.         else                        //被删结点左右子树均不空   
  337.         {  
  338.             Delete2(q,q->lchild,taller);  
  339.             if (taller==1)  
  340.                 LeftProcess1(q,taller);  
  341.             p=q;  
  342.         }  
  343.         return 1;  
  344.     }  
  345. }  
  346. int main()  
  347. {  
  348.     BSTNode *b=NULL;  
  349.     int i,j,k;  
  350.     KeyType a[]= {16,3,7,11,9,26,18,14,15},n=9; //例10.5   
  351.     printf(" 创建一棵AVL树:\n");  
  352.     for(i=0; i<n; i++)  
  353.     {  
  354.         printf("   第%d步,插入%d元素:",i+1,a[i]);  
  355.         InsertAVL(b,a[i],j);  
  356.         DispBSTree(b);  
  357.         printf("\n");  
  358.     }  
  359.     printf("   AVL:");  
  360.     DispBSTree(b);  
  361.     printf("\n");  
  362.     printf(" 删除结点:\n");                     //例10.6   
  363.     k=11;  
  364.     printf("   删除结点%d:",k);  
  365.     DeleteAVL(b,k,j);  
  366.     printf("   AVL:");  
  367.     DispBSTree(b);  
  368.     printf("\n");  
  369.     k=9;  
  370.     printf("   删除结点%d:",k);  
  371.     DeleteAVL(b,k,j);  
  372.     printf("   AVL:");  
  373.     DispBSTree(b);  
  374.     printf("\n");  
  375.     k=15;  
  376.     printf("   删除结点%d:",k);  
  377.     DeleteAVL(b,k,j);  
  378.     printf("   AVL:");  
  379.     DispBSTree(b);  
  380.     printf("\n\n");  
  381.     return 0;  
  382. }  
#include <stdio.h>
#include <malloc.h>
typedef int KeyType;                    //定义关键字类型
typedef char InfoType;
typedef struct node                     //记录类型
{
    KeyType key;                        //关键字项
    int bf;                             //平衡因子
    InfoType data;                      //其他数据域
    struct node *lchild,*rchild;        //左右孩子指针
} BSTNode;
void LeftProcess(BSTNode *&p,int &taller)
//对以指针p所指结点为根的二叉树作左平衡旋转处理,本算法结束时,指针p指向新的根结点
{
    BSTNode *p1,*p2;
    if (p->bf==0)           //原本左、右子树等高,现因左子树增高而使树增高
    {
        p->bf=1;
        taller=1;
    }
    else if (p->bf==-1)     //原本右子树比左子树高,现左、右子树等高
    {
        p->bf=0;
        taller=0;
    }
    else                    //原本左子树比右子树高,需作左子树的平衡处理
    {
        p1=p->lchild;       //p指向*p的左子树根结点
        if (p1->bf==1)      //新结点插入在*b的左孩子的左子树上,要作LL调整
        {
            p->lchild=p1->rchild;
            p1->rchild=p;
            p->bf=p1->bf=0;
            p=p1;
        }
        else if (p1->bf==-1)    //新结点插入在*b的左孩子的右子树上,要作LR调整
        {
            p2=p1->rchild;
            p1->rchild=p2->lchild;
            p2->lchild=p1;
            p->lchild=p2->rchild;
            p2->rchild=p;
            if (p2->bf==0)          //新结点插在*p2处作为叶子结点的情况
                p->bf=p1->bf=0;
            else if (p2->bf==1)     //新结点插在*p2的左子树上的情况
            {
                p1->bf=0;
                p->bf=-1;
            }
            else                    //新结点插在*p2的右子树上的情况
            {
                p1->bf=1;
                p->bf=0;
            }
            p=p2;
            p->bf=0;            //仍将p指向新的根结点,并置其bf值为0
        }
        taller=0;
    }
}
void RightProcess(BSTNode *&p,int &taller)
//对以指针p所指结点为根的二叉树作右平衡旋转处理,本算法结束时,指针p指向新的根结点
{
    BSTNode *p1,*p2;
    if (p->bf==0)           //原本左、右子树等高,现因右子树增高而使树增高
    {
        p->bf=-1;
        taller=1;
    }
    else if (p->bf==1)      //原本左子树比右子树高,现左、右子树等高
    {
        p->bf=0;
        taller=0;
    }
    else                    //原本右子树比左子树高,需作右子树的平衡处理
    {
        p1=p->rchild;       //p指向*p的右子树根结点
        if (p1->bf==-1)     //新结点插入在*b的右孩子的右子树上,要作RR调整
        {
            p->rchild=p1->lchild;
            p1->lchild=p;
            p->bf=p1->bf=0;
            p=p1;
        }
        else if (p1->bf==1) //新结点插入在*p的右孩子的左子树上,要作RL调整
        {
            p2=p1->lchild;
            p1->lchild=p2->rchild;
            p2->rchild=p1;
            p->rchild=p2->lchild;
            p2->lchild=p;
            if (p2->bf==0)          //新结点插在*p2处作为叶子结点的情况
                p->bf=p1->bf=0;
            else if (p2->bf==-1)    //新结点插在*p2的右子树上的情况
            {
                p1->bf=0;
                p->bf=1;
            }
            else                    //新结点插在*p2的左子树上的情况
            {
                p1->bf=-1;
                p->bf=0;
            }
            p=p2;
            p->bf=0;            //仍将p指向新的根结点,并置其bf值为0
        }
        taller=0;
    }
}
int InsertAVL(BSTNode *&b,KeyType e,int &taller)
/*若在平衡的二叉排序树b中不存在和e有相同关键字的结点,则插入一个
  数据元素为e的新结点,并返回1,否则返回0。若因插入而使二叉排序树
  失去平衡,则作平衡旋转处理,布尔变量taller反映b长高与否*/
{
    if(b==NULL)         //原为空树,插入新结点,树“长高”,置taller为1
    {
        b=(BSTNode *)malloc(sizeof(BSTNode));
        b->key=e;
        b->lchild=b->rchild=NULL;
        b->bf=0;
        taller=1;
    }
    else
    {
        if (e==b->key)              //树中已存在和e有相同关键字的结点则不再插入
        {
            taller=0;
            return 0;
        }
        if (e<b->key)               //应继续在*b的左子树中进行搜索
        {
            if ((InsertAVL(b->lchild,e,taller))==0) //未插入
                return 0;
            if (taller==1)          //已插入到*b的左子树中且左子树“长高”
                LeftProcess(b,taller);
        }
        else                        //应继续在*b的右子树中进行搜索
        {
            if ((InsertAVL(b->rchild,e,taller))==0) //未插入
                return 0;
            if (taller==1)          //已插入到b的右子树且右子树“长高”
                RightProcess(b,taller);
        }
    }
    return 1;
}
void DispBSTree(BSTNode *b) //以括号表示法输出AVL
{
    if (b!=NULL)
    {
        printf("%d",b->key);
        if (b->lchild!=NULL || b->rchild!=NULL)
        {
            printf("(");
            DispBSTree(b->lchild);
            if (b->rchild!=NULL) printf(",");
            DispBSTree(b->rchild);
            printf(")");
        }
    }
}
void LeftProcess1(BSTNode *&p,int &taller)  //在删除结点时进行左处理
{
    BSTNode *p1,*p2;
    if (p->bf==1)
    {
        p->bf=0;
        taller=1;
    }
    else if (p->bf==0)
    {
        p->bf=-1;
        taller=0;
    }
    else        //p->bf=-1
    {
        p1=p->rchild;
        if (p1->bf==0)          //需作RR调整
        {
            p->rchild=p1->lchild;
            p1->lchild=p;
            p1->bf=1;
            p->bf=-1;
            p=p1;
            taller=0;
        }
        else if (p1->bf==-1)    //需作RR调整
        {
            p->rchild=p1->lchild;
            p1->lchild=p;
            p->bf=p1->bf=0;
            p=p1;
            taller=1;
        }
        else                    //需作RL调整
        {
            p2=p1->lchild;
            p1->lchild=p2->rchild;
            p2->rchild=p1;
            p->rchild=p2->lchild;
            p2->lchild=p;
            if (p2->bf==0)
            {
                p->bf=0;
                p1->bf=0;
            }
            else if (p2->bf==-1)
            {
                p->bf=1;
                p1->bf=0;
            }
            else
            {
                p->bf=0;
                p1->bf=-1;
            }
            p2->bf=0;
            p=p2;
            taller=1;
        }
    }
}
void RightProcess1(BSTNode *&p,int &taller) //在删除结点时进行右处理
{
    BSTNode *p1,*p2;
    if (p->bf==-1)
    {
        p->bf=0;
        taller=-1;
    }
    else if (p->bf==0)
    {
        p->bf=1;
        taller=0;
    }
    else        //p->bf=1
    {
        p1=p->lchild;
        if (p1->bf==0)          //需作LL调整
        {
            p->lchild=p1->rchild;
            p1->rchild=p;
            p1->bf=-1;
            p->bf=1;
            p=p1;
            taller=0;
        }
        else if (p1->bf==1)     //需作LL调整
        {
            p->lchild=p1->rchild;
            p1->rchild=p;
            p->bf=p1->bf=0;
            p=p1;
            taller=1;
        }
        else                    //需作LR调整
        {
            p2=p1->rchild;
            p1->rchild=p2->lchild;
            p2->lchild=p1;
            p->lchild=p2->rchild;
            p2->rchild=p;
            if (p2->bf==0)
            {
                p->bf=0;
                p1->bf=0;
            }
            else if (p2->bf==1)
            {
                p->bf=-1;
                p1->bf=0;
            }
            else
            {
                p->bf=0;
                p1->bf=1;
            }
            p2->bf=0;
            p=p2;
            taller=1;
        }
    }
}
void Delete2(BSTNode *q,BSTNode *&r,int &taller)
//由DeleteAVL()调用,用于处理被删结点左右子树均不空的情况
{
    if (r->rchild==NULL)
    {
        q->key=r->key;
        q=r;
        r=r->lchild;
        free(q);
        taller=1;
    }
    else
    {
        Delete2(q,r->rchild,taller);
        if (taller==1)
            RightProcess1(r,taller);
    }
}
int DeleteAVL(BSTNode *&p,KeyType x,int &taller) //在AVL树p中删除关键字为x的结点
{
    int k;
    BSTNode *q;
    if (p==NULL)
        return 0;
    else if (x<p->key)
    {
        k=DeleteAVL(p->lchild,x,taller);
        if (taller==1)
            LeftProcess1(p,taller);
        return k;
    }
    else if (x>p->key)
    {
        k=DeleteAVL(p->rchild,x,taller);
        if (taller==1)
            RightProcess1(p,taller);
        return k;
    }
    else            //找到了关键字为x的结点,由p指向它
    {
        q=p;
        if (p->rchild==NULL)        //被删结点右子树为空
        {
            p=p->lchild;
            free(q);
            taller=1;
        }
        else if (p->lchild==NULL)   //被删结点左子树为空
        {
            p=p->rchild;
            free(q);
            taller=1;
        }
        else                        //被删结点左右子树均不空
        {
            Delete2(q,q->lchild,taller);
            if (taller==1)
                LeftProcess1(q,taller);
            p=q;
        }
        return 1;
    }
}
int main()
{
    BSTNode *b=NULL;
    int i,j,k;
    KeyType a[]= {16,3,7,11,9,26,18,14,15},n=9; //例10.5
    printf(" 创建一棵AVL树:\n");
    for(i=0; i<n; i++)
    {
        printf("   第%d步,插入%d元素:",i+1,a[i]);
        InsertAVL(b,a[i],j);
        DispBSTree(b);
        printf("\n");
    }
    printf("   AVL:");
    DispBSTree(b);
    printf("\n");
    printf(" 删除结点:\n");                     //例10.6
    k=11;
    printf("   删除结点%d:",k);
    DeleteAVL(b,k,j);
    printf("   AVL:");
    DispBSTree(b);
    printf("\n");
    k=9;
    printf("   删除结点%d:",k);
    DeleteAVL(b,k,j);
    printf("   AVL:");
    DispBSTree(b);
    printf("\n");
    k=15;
    printf("   删除结点%d:",k);
    DeleteAVL(b,k,j);
    printf("   AVL:");
    DispBSTree(b);
    printf("\n\n");
    return 0;
}

二、测试结果截图如下:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值