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 }
  • 相关阅读:
    JavaScript中的闭包
    SQL 备忘
    SqlServer 2005 升级至SP2过程中出现"身份验证"无法通过的问题
    unable to start debugging on the web server iis does not list an application that matches the launched url
    Freebsd 编译内核
    Freebsd 6.2中关于无线网络的设定
    【Oracle】ORA01219
    【Linux】Windows到Linux的文件复制
    【Web】jar命令行生成jar包
    【Linux】CIFS挂载Windows共享
  • 原文地址:https://www.cnblogs.com/mjgw/p/12590749.html
Copyright © 2011-2022 走看看