数据结构之二叉 排序树

1)二叉顺序树查找操作:(注释内容来自《大话数据结构》)

2)二叉顺序树插入操作:

3)二叉顺序树删除操作:

完整代码如下:

  1 #include "stdafx.h"
  2 #include<iostream>
  3 using namespace std;
  4 typedef int Status;
  5 #define FALSE 0
  6 #define TRUE 1
  7 typedef struct BiTNode
  8 {
  9     int data;//结点数据
 10     struct BiTNode *lchild, *rchild; //左右孩子指针
 11 }BiTNode,*BiTree;
 12 
 13 //递归查找二叉排序树T中是否存在key,
 14 //指针f指向T的双亲,其初始调用值为NULL
 15 //若查找成功,则指针p指向该数据元素结点,并返回TRUE 
 16 //否则指针p指向查找路径上访问的最后一个结点并返回FALSE
 17 Status SearchBST(BiTree T, int key, BiTree f, BiTree *p)
 18 {
 19     if (!T)                       //查找失败
 20     {
 21         *p = f;
 22         return FALSE;
 23     }
 24     else if (key == T->data)      //查找成功
 25     {
 26         *p = T;
 27         return TRUE;
 28     }
 29     else if (key < T->data)
 30         return SearchBST(T->lchild, key, T, p);//在左子树中继续查找
 31     else
 32         return SearchBST(T->rchild, key, T, p);//在右子树中继续查找
 33 }
 34 
 35 Status InsertBST(BiTree *T, int key)
 36 {
 37     BiTree p, s;
 38     if (!SearchBST(*T, key, NULL, &p))//查找失败
 39     {
 40         s = new BiTNode;
 41         s->data = key;
 42         s->lchild = s->rchild = NULL;
 43         if (!p)
 44             *T = s;               //插入s为新的根节点
 45         else if (key < p->data)
 46             p->lchild = s;        //插入s为左孩子
 47         else
 48             p->rchild = s;        //插入s为右孩子
 49     }
 50     else
 51         return FALSE;             // 树中已有关键字相同的结点,不再插入
 52 }
 53 
 54 //从二叉排序树中删除结点p,并重接它的左或右子树
 55 Status Delete(BiTree *p)
 56 {
 57     BiTree q, s;
 58     if ((*p)->rchild == NULL)     //右子树空则只需重接它的左子树(待删结点是叶子也走此分支)
 59     {
 60         q = *p; 
 61         *p = (*p)->lchild; 
 62         free(q);
 63     }
 64     else if ((*p)->lchild == NULL) //只需重接它的右子树
 65     {
 66         q = *p; 
 67         *p = (*p)->rchild; 
 68         free(q);
 69     }
 70     else                          //左右子树均不空
 71     {
 72         q = *p; 
 73         s = (*p)->lchild;
 74         while (s->rchild)         //转左,然后向右到尽头(找待删结点的前驱)
 75         {
 76             q = s;
 77             s = s->rchild;
 78         }
 79         (*p)->data = s->data;     //s指向被删结点的直接前驱(将被删结点前驱的值取代被删结点的值)
 80         if (q != *p)
 81             q->rchild = s->lchild;//重接q的右子树 
 82         else
 83             q->lchild = s->lchild;//重接q的左子树
 84         free(s);
 85     }
 86     return TRUE;
 87 }
 88 
 89 //若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素结点,
 90 //并返回TRUE;否则返回FALSE
 91 Status DeleteBST(BiTree *T, int key)
 92 {
 93     if (!*T)                      //不存在关键字等于key的数据元素
 94         return FALSE;
 95     else
 96     {
 97         if (key == (*T)->data)    //找到关键字等于key的数据元素
 98             return Delete(T);
 99         else if (key<(*T)->data)
100             return DeleteBST(&(*T)->lchild, key);
101         else
102             return DeleteBST(&(*T)->rchild, key);
103     }
104 }
105 
106 
107 int main()
108 {
109     int i;
110     int a[10] = { 62,88,58,47,35,73,51,99,37,93 };
111     BiTree T = NULL;
112 
113     for (i = 0; i<10; i++)
114     {
115         InsertBST(&T, a[i]);
116     }
117     DeleteBST(&T, 93);
118     DeleteBST(&T, 47);
119     cout<<"本样例建议断点跟踪查看二叉排序树结构";
120     return 0;
121 }

猜你喜欢

转载自www.cnblogs.com/Trojan00/p/9030496.html
今日推荐