zoukankan      html  css  js  c++  java
  • 二叉搜索树(遍历,查找,插入,删除)

    二叉搜索树就类似于二分查找,根节点的左边都比根结点小,右边都比根结点大。

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 
      4 typedef int TElemType;
      5 typedef int ElemType;
      6 #define OK 1
      7 #define ERROR -1
      8 
      9 typedef struct BiTNode
     10 {
     11     TElemType data;
     12     struct BiTNode* lchild;
     13     struct BiTNode* rchild;
     14 }BiTNode,*BiTree;
     15 //前序遍历创建二叉树
     16 void PreOrderCreatBiTree(BiTree *T)
     17 {
     18     int ch;
     19     scanf("%d", &ch);
     20     if (ch == 0)
     21     {
     22         *T = NULL;
     23     }
     24     else
     25     {
     26         *T = (BiTNode *)malloc(sizeof(BiTNode));
     27         (*T)->data = ch;
     28         PreOrderCreatBiTree(&(*T)->lchild);
     29         PreOrderCreatBiTree(&(*T)->rchild);
     30     }
     31 }
     32 //前序遍历
     33 void PreOrderTarverse(BiTree T)
     34 {
     35     if (T)
     36     {
     37         printf("%d", T->data);
     38         PreOrderTarverse(T->lchild);
     39         PreOrderTarverse(T->rchild);
     40     }
     41 }
     42 //查找元素
     43 int Find(ElemType x, BiTree T)
     44 {
     45     if (!T)  //如果树为空
     46         return ERROR;
     47     if (x > T->data)
     48     {
     49         return Find(x, T->rchild);
     50     }
     51     else if (x < T->data)
     52     {
     53         return Find(x, T->lchild);
     54     }
     55     else if(x == T->data)
     56     {
     57         return OK;
     58     }
     59     return ERROR;
     60 }
     61 //查找最小值并返回值
     62 int FindMin(BiTree T)
     63 {
     64     if (!T)  //如果树为空
     65     {
     66         return ERROR;
     67     }
     68     else if (!T->lchild)
     69     {
     70         return T->data;
     71     }
     72     else
     73     {
     74         return FindMin(T->lchild);
     75     }
     76 }
     77 //查找最小值并返回地址
     78 BiTree FindMinAddress(BiTree T)//删除使用到
     79 {
     80     if (!T)  //如果树为空
     81     {
     82         return NULL;
     83     }
     84     else if (!T->lchild)
     85     {
     86         return T;
     87     }
     88     else
     89     {
     90         return FindMin(T->lchild);
     91     }
     92 }
     93 //查找最大值并返回值
     94 int FindMax(BiTree T)
     95 {
     96     if (T)
     97     {
     98         while (T->rchild)
     99         {
    100             T = T->rchild;
    101         }
    102     }
    103     return T->data;
    104 }
    105 //插入
    106 BiTree Insert(BiTree *T, ElemType x)
    107 {
    108     if (!(*T))  //数为空,则生成并返回一个结点的搜索二叉树
    109     {
    110         *T = (BiTNode *)malloc(sizeof(BiTNode));
    111         (*T)->data = x;
    112         (*T)->lchild = (*T)->rchild = NULL;
    113     }
    114     else  //开始找要插入元素的位置
    115     {
    116         if (x < (*T)->data)
    117         {
    118             (*T)->lchild = Insert(&(*T)->lchild, x);  //递归插入左子树
    119         }
    120         else if (x > (*T)->data)
    121         {
    122             (*T)->rchild = Insert(&(*T)->rchild, x);  //递归插入右子树    
    123         }
    124         //else x已经存在,什么都不做
    125     }
    126     return *T;
    127 }
    128 //删除
    129 BiTree Delete(BiTree* T, ElemType x)
    130 {
    131     BiTree Tmp;
    132 
    133     if (!(*T))
    134     {
    135         printf("要删除的元素未找到");
    136     }
    137     else
    138     {
    139         if (x < (*T)->data) //递归左子树
    140         {
    141             (*T)->lchild = Delete(&(*T)->lchild, x);
    142         }
    143         else if (x > (*T)->data) //递归右子树
    144         {
    145             (*T)->rchild = Delete(&(*T)->rchild, x);
    146         }
    147         else  //递归到要删除的结点
    148         {
    149             if ((*T)->lchild && (*T)->rchild)  //被删除结点有两个子树
    150             {
    151                 Tmp = FindMinAddress((*T)->rchild);
    152                 (*T)->data = Tmp->data;
    153                 (*T)->rchild = Delete(&(*T)->rchild, (*T)->data);
    154             }
    155             else
    156             {
    157                 Tmp = *T;
    158                 if (!(*T)->lchild) //只有右孩子或者没有子结点
    159                 {
    160                     *T = (*T)->rchild;
    161                 }
    162                 else
    163                 {
    164                     *T = (*T)->lchild;
    165                 }
    166                 free(Tmp);
    167             }
    168 
    169         }
    170     }
    171     return *T;
    172 }
    173 
    174 int main()
    175 {
    176     BiTree T = NULL;
    177     int FindNum;
    178     int temp;
    179     int min,max;
    180     int InsertNum;
    181     int DeleteNum;
    182 
    183     printf("请输入数据,0表示空
    ");
    184     PreOrderCreatBiTree(&T);
    185     printf("前序遍历二叉树并打印:
    ");
    186     PreOrderTarverse(T);
    187 
    188     printf("
    请输入你想要查找的元素:");
    189     scanf("%d", &FindNum);
    190     temp = Find(FindNum,T);
    191     if (temp == 1)
    192     {
    193         printf("查找成功!你所要查找的数据在树中
    ");
    194     }
    195     else if(temp == -1)
    196     {
    197         printf("查找失败!你所要查找的数据不在树中
    ");
    198     }
    199 
    200     min = FindMin(T);
    201     printf("树中的最小值是:%d
    ", min);
    202     max = FindMax(T);
    203     printf("树中的最大值是:%d
    ", max);
    204 
    205     printf("请输入你想要插入的数据:");
    206     scanf("%d", &InsertNum);
    207     Insert(&T, InsertNum);
    208     printf("插入后遍历树并打印:
    ");
    209     PreOrderTarverse(T);
    210 
    211     printf("
    请输入你想要删除的数据:");
    212     scanf("%d", &DeleteNum);
    213     Delete(&T, DeleteNum);
    214     printf("删除后遍历树并打印:
    ");
    215     PreOrderTarverse(T);
    216 
    217     return 0;
    218 }
  • 相关阅读:
    《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南
    《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南
    《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南
    使用Jasmine和karma对传统js进行单元测试
    《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南
    《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南
    nginx 基于IP的多虚拟主机配置
    Shiro 框架的MD5加密算法实现原理
    项目实战:Qt+OSG三维点云引擎(支持原点,缩放,单独轴或者组合多轴拽拖旋转,支持导入点云文件)
    实用技巧:阿里云服务器建立公网物联网服务器(解决阿里云服务器端口,公网连接不上的问题)
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12604407.html
Copyright © 2011-2022 走看看