zoukankan      html  css  js  c++  java
  • 二叉搜索树(二叉查找树)

    二叉搜索树(二叉查找树)
    1.树中的每个结点都有一个唯一的关键字
    2.如果有左子树,所有的左子树关键字的值小于根结点的关键字
    3.如果有右子树,所有的右子树关键字的值大于根结点的关键字
    4.左右子树也是二叉查找树


    1.作业:
    y=(*s)->RChild
    右边分析图
    代码

    2. 二叉查找的测试代码

    复制代码
      1 //BinarySearchTree.cpp
      2 
      3 #include <iostream>
      4 using namespace std;
      5 
      6 typedef struct Node 
      7 {
      8     int data;
      9     struct Node* LChild;
     10     struct Node* RChild;
     11 }BITREE,*LPBITREE;
     12 int BSTInsert(LPBITREE *T, int x)
     13 {
     14     LPBITREE p, cur, parent = NULL;
     15     cur = *T;  //T是二级指针  
     16     while (cur != NULL)
     17     {
     18         //找到插入的位置
     19         //如果存在树中
     20         if (cur->data == x)
     21         {
     22             return 0;
     23         }
     24         parent = cur;
     25         //比当前节点的值大--->右子树
     26         if (x >cur->data)
     27         {
     28             cur = cur->RChild;
     29         }
     30         //比当前节点的值小--->左子树
     31         else
     32         {
     33             cur = cur->LChild;
     34         }
     35     }
     36   //新建插入的结点的空间
     37     p = new BITREE;
     38     //判断内存是否失败
     39     if (!p)
     40     {
     41         exit(0);
     42     }
     43   //初始化基本数据成员
     44     p->data = x;
     45     p->LChild = NULL;
     46     p->RChild = NULL;
     47   //插入到合适的位置
     48     //没有进入  parent=NULL cur=NULL  插入的结点是树根
     49     if (!parent)
     50     {
     51         *T = p;
     52     }
     53     //如果关键字小于父结点  当作parent->LChild
     54     else if (x < parent->data)
     55         parent->LChild = p;
     56     else
     57         parent->RChild = p;
     58     return 1;
     59 }
     60 
     61 void MidOrderTraverse(LPBITREE T)
     62 {
     63     if (T)
     64     {
     65         MidOrderTraverse(T->LChild);
     66         cout << T->data <<"-->";
     67         MidOrderTraverse(T->RChild);
     68     }
     69 }
     70 
     71 LPBITREE BSTSearch(LPBITREE T, int x)
     72 {
     73     LPBITREE p;
     74     if (T != NULL)
     75     {
     76         p = T;
     77         while (p != NULL)
     78         {
     79             if (p->data == x)
     80             {
     81                 return p;
     82             }
     83             else if (p->data > x)
     84             {
     85                 p = p->LChild;
     86             }
     87             else if (p->data < x)
     88             {
     89                 p = p->RChild;
     90             }
     91         }
     92     }
     93     return NULL;
     94 }
     95 void DeleteNode(LPBITREE *s)
     96 {
     97     LPBITREE q, x, y;
     98     //左子树为空  把右子树拿上来就可以
     99     if (!(*s)->LChild)
    100     {
    101         q = *s;  //先保存原来  再释放
    102         *s = (*s)->RChild;
    103         delete q;
    104     }
    105     else if  (!(*s)->RChild)
    106     {
    107         q = *s;
    108         *s = (*s)->LChild;
    109         delete q;
    110     }
    111     else  //作业改为右边分析
    112     {
    113         x = *s;
    114         y = (*s)->LChild;
    115         while (y->RChild)
    116         {
    117             x = y;
    118             y = y->RChild;
    119         }
    120         (*s)->data = y->data;
    121         if (x == (*s))
    122         {
    123             x->LChild = y->LChild;
    124         }
    125         else
    126         {
    127             x->RChild = y->LChild;
    128         }
    129         delete y; //注意空间释放哪一个
    130     }
    131 }
    132 
    133 int BSTDelete(LPBITREE *T, int x)
    134 {
    135     if (!*T)
    136     {
    137         return 0;
    138     }
    139     else
    140     {
    141         if (x == (*T)->data)
    142         {
    143             DeleteNode(T);
    144         }
    145         else if ((*T)->data > x)
    146         {
    147             BSTDelete(&(*T)->LChild, x);
    148         }
    149         else if ((*T)->data < x)
    150         {
    151             BSTDelete(&(*T)->RChild, x);
    152         }
    153         return 1; 
    154     }
    155 }
    156 
    157 int main()
    158 {
    159     int Array[] = { 89, 23, 47, 58, 25, 78, 100, 29, 68, 38 };
    160     int ArrayNum = sizeof(Array) / sizeof(Array[0]);
    161     LPBITREE T = NULL;
    162     for (int i = 0; i < ArrayNum; i++)
    163     {
    164         BSTInsert(&T, Array[i]);
    165     }
    166     cout << "中序遍历:" << endl;
    167     MidOrderTraverse(T);
    168     cout << endl;
    169     BSTDelete(&T, 78);
    170     LPBITREE p = BSTSearch(T, 78);
    171     if (!p)
    172         cout << "未找到指定位置" << endl;
    173     else
    174         cout << "查找得到的数据是:" << p->data << endl;
    175     system("pause");
    176     return 0;
    177 }
    复制代码
    复制代码
     1 //二分查找.cpp
     2 
     3 #include <iostream>
     4 using namespace std;
     5 int BinarySearch(int Array[], int value, int start, int end)
     6 {
     7     if (start > end)
     8     {
     9         return -1;
    10     }
    11     int mid = start + (end - start) / 2;
    12     if (Array[mid] == value)
    13         return mid;
    14     else if (value < Array[mid])
    15     {
    16         end = mid - 1;
    17         return BinarySearch(Array, value, start, end);
    18     }
    19     else
    20     {
    21         start = mid + 1;
    22         return BinarySearch(Array, value, start, end);
    23     }
    24 }
    25 
    26 //防御性编程
    27 int BinarySearchPos(int Array[], int len, int value)
    28 {
    29     if (Array == NULL || len <= 0)
    30         return 1;
    31     int start = 0;
    32     int end = len - 1;
    33     return BinarySearch(Array, value, start, end);
    34 }
    35 int main()
    36 {
    37     //测试  作业
    38 
    39 
    40     return 0;
    41 }
  • 相关阅读:
    Android 之 Android目录
    Android之新建项目
    Android 所遇问题(一)
    Android运行机制
    C#编程语法积累(二)
    C#编程的语法积累(一)
    MVC4.0网站发布
    SQLServer 之 树查询
    Linux回收站[改写rm防止误删文件无法恢复]
    音视频同步(播放)原理
  • 原文地址:https://www.cnblogs.com/mjgw/p/12590749.html
Copyright © 2011-2022 走看看