小言_互联网的博客

二叉排序树(BST)/二叉查找树的建立(BST是笔试面试的常客)

412人阅读  评论(0)

         二叉排序树又叫二叉查找树,英文名称是:Binary Sort Tree.  BST的定义就不详细说了,我用一句话概括:左 < 中 < 右

        根据这个原理,我们可以推断:BST的中序遍历必定是严格递增的

 

         在建立一个BST之前,大家可以做一下这个题目(很简单的):

        已知,某树的先序遍历为:4, 2, 1 ,0, 3, 5, 9, 7, 6, 8. 中序遍历为: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. 请画出该树。

 

        我们知道,树的基本遍历有4种方式,分别是:

        先序遍历;中序遍历;后续遍历;层次遍历。事实上,知道任意两种方式,并不能唯一地确定树的结构,但是,只要知道中序遍历和另外任意一种遍历方式,就一定可以唯一地确定一棵树,于是,上面那个题目的答案如下:

 

      下面,我们来看看BST的建立过程,程序如下(没考虑内存泄露):


  
  1. #include <iostream>
  2. using namespace std;
  3. // BST的结点
  4. typedef struct node
  5. {
  6. int key;
  7. struct node *lChild, *rChild;
  8. }Node, *BST;
  9. // 在给定的BST中插入结点,其数据域为element, 使之称为新的BST
  10. bool BSTInsert(Node * &p, int element)
  11. {
  12. if( NULL == p) // 空树
  13. {
  14. p = new Node;
  15. p->key = element;
  16. p->lChild = p->rChild = NULL;
  17. return true;
  18. }
  19. if(element == p->key) // BST中不能有相等的值
  20. return false;
  21. if(element < p->key) // 递归
  22. return BSTInsert(p->lChild, element);
  23. return BSTInsert(p->rChild, element); // 递归
  24. }
  25. // 建立BST
  26. void createBST(Node * &T, int a[], int n)
  27. {
  28. T = NULL;
  29. int i;
  30. for(i = 0; i < n; i++)
  31. {
  32. BSTInsert(T, a[i]);
  33. }
  34. }
  35. // 先序遍历
  36. void preOrderTraverse(BST T)
  37. {
  38. if(T)
  39. {
  40. cout << T->key << " ";
  41. preOrderTraverse(T->lChild);
  42. preOrderTraverse(T->rChild);
  43. }
  44. }
  45. // 中序遍历
  46. void inOrderTraverse(BST T)
  47. {
  48. if(T)
  49. {
  50. inOrderTraverse(T->lChild);
  51. cout << T->key << " ";
  52. inOrderTraverse(T->rChild);
  53. }
  54. }
  55. int main()
  56. {
  57. int a[ 10] = { 4, 5, 2, 1, 0, 9, 3, 7, 6, 8};
  58. int n = 10;
  59. BST T;
  60. // 并非所有的a[]都能构造出BST,所以,最好对createBST的返回值进行判断
  61. createBST(T, a, n);
  62. preOrderTraverse(T);
  63. cout << endl;
  64. inOrderTraverse(T);
  65. cout << endl;
  66. return 0;
  67. }

 

       那么,怎么知道我们这个程序对不对呢?

       我们输出其先序和中序遍历,这样就可以完全确定这棵树,运行程序。

       发现先序遍历为:4, 2, 1 ,0, 3, 5, 9, 7, 6, 8.

       中序遍历为: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

       好了,这棵树确定了,如上图(已画),那棵树真的是一棵BST, 真的。在后续的博文中,我们会给出二叉排序树的判定方法,期待ing.
 

 

 


转载:https://blog.csdn.net/stpeace/article/details/9067029
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场