Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2877570
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-04-28 10:22:23

1.定义

     二叉排序树(Binary Search Tree)又称二叉搜索(查找)树,其定义如下:

    (1)若它的左子树非空,则左子树上所有结点的权值都比根结点的权值小;

    (2)若它的右子数非空,则右子树上所有结点的权值都比根结点的权值大;

    (3)左、右子树本身又是一棵二叉排序树。

以上既是二叉排序树的定义,同时也是它的性质。从定义可以看出,二叉排序树的定义是一个递归的定义。对于一棵二叉排序树的中序遍历则是一个递增有序序列。

2.二叉排序树的插入Insert

   根据二叉排序树的递归定义,进行插入操作的时候可以用递归实现,其插入过程如下:

   (1)如果二叉排序树为空,则创建一个关键字为key的结点,并将其作为根结点;

   (2)否则将key和根结点的key值比较,若相等则返回;

       1)若key值小于根结点的key值,判断根结点的左孩子是否为空,

          如果为空,则创建一个关键字为key的结点,并将该结点作为根结点的左孩子;

          如果不为空,则递归插入到该根结点的左子树当中。

       2)若key值大于根结点的key值,判断根结点的右孩子是否为空,

          如果为空,则创建一个关键字为key的结点,并将该结点作为根结点的右孩子;

          如果不为空,则递归插入到该根结点的右子树当中。

 
 

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #include<iostream>
  4. #include<string>
  5. using namespace std;
  6. typedef int ElemType;//假定关键字类型为整数
  7. typedef struct node
  8. {
  9.     ElemType key;
  10.     struct node * left,* right;
  11. } BSTNode;

  12. BSTNode * search(BSTNode *root,ElemType key)//查找某个关键字是否存在
  13. {
  14.     if(root==NULL||root->key==key)
  15.         return root;
  16.     else if(key<root->key)
  17.         search(root->left,key);
  18.     else
  19.         search(root->right,key);
  20. }

  21. BSTNode * FindMin(BSTNode *root)//递归查找
  22. {
  23.     if(root==NULL)
  24.     return NULL;
  25.     else if(root->left==NULL)
  26.         return root;
  27.     else
  28.         return FindMin(root->left);
  29. }
  30. BSTNode *FinMax(BSTNode *root)//非递归查找
  31. {
  32.     if(root!=NULL)
  33.         while(root->right!=NULL)
  34.             root=root->right;
  35.     return root;
  36. }

  37. void dfs(BSTNode *root) //else if只是深度搜索一个分支,没有回溯,
  38. //去掉else,深度遍历了一下
  39. /*
  40. 5 8 7 9 3 2 4 0
  41. 2
  42. 9
  43. key=5
  44. key=3
  45. key=2
  46. key=4
  47. key=8
  48. key=7
  49. key=9
  50. */
  51. {
  52.     printf("key=%d\n",root->key);
  53.     if(root->left)
  54.         dfs(root->left);
  55.     if(root->right)
  56.         dfs(root->right);
  57. }


  58. void insert(BSTNode *&root,ElemType key) //注意这里为什么用指针的引用
  59. {
  60.     if(root==NULL) //如果该树为空
  61.     {
  62.         root=(BSTNode*)malloc(sizeof(BSTNode));
  63.         root->key=key;
  64.         root->left=NULL;
  65.         root->right=NULL;
  66.     }
  67.     else
  68.        {
  69.         if(root->key==key) //1、如果已经存在,则直接返回
  70.             return;
  71.         else if(root->key>key) //2、key小于根结点的权值
  72.              {
  73.                 if(root->left==NULL) //root的左孩子为空,则创建一个结点作为root的左孩子
  74.                 {
  75.                     BSTNode*p=(BSTNode *)malloc(sizeof(BSTNode));
  76.                     p->key=key;
  77.                     p->left=NULL;
  78.                     p->right=NULL;
  79.                     root->left=p;//直接挂在它的左子树
  80.                 }
  81.                 else
  82.                     insert(root->left,key); //递归插入到左子树中
  83.             }
  84.         else                    //3、key大于根结点的权值
  85.         {
  86.             if(root->right==NULL) //root的右孩子为空,则创建一个结点作为root的右孩子
  87.             {
  88.                 BSTNode*p=(BSTNode *)malloc(sizeof(BSTNode));
  89.                 p->key=key;
  90.                 p->left=NULL;
  91.                 p->right=NULL;
  92.                 root->right=p;
  93.             }
  94.             else
  95.                 insert(root->right,key); //递归插入到右子树中
  96.         }
  97.     }
  98. }

  99. int main()
  100. {
  101.     BSTNode *root=NULL;
  102.     int key;
  103.     scanf("%d",&key);
  104.     while(key)//假设key=0是输入结束标志
  105.     {
  106.         insert(root,key);
  107.         scanf("%d",&key);
  108.     }

  109.     printf("%d\n",FindMin(root)->key);
  110.     printf("%d\n",FinMax(root)->key);
  111.     dfs(root);
  112.     return 0;
  113. }

  114. /*
  115. 5 8 7 9 3 2 4 0
  116. 2
  117. 9
  118. key=5
  119. key=3
  120. key=2
  121. Press any key to continue
  122. */

阅读(1659) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~