数据结构【查找】—二叉树排序以及查找

àì夳堔傛蜴生んèń 2022-10-02 15:55 286阅读 0赞

讲解:

  总结一句话:

    小的左边,大的放右边。

  特点:    

    二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树。

    若它的左子树不空,则左子树上所有结点的值均小于它的根结构的值;

    若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;  

    它的左、右子树也分别为二又排序树。

1463063-20190324160411232-808620531.png

二叉树创建代码:

  1. 1 //创建二叉树
  2. 2 void InsertBST(BiTree* &T, int elem) {
  3. 3 BiTree *p = new BiTree;
  4. 4 p->data = elem;
  5. 5 p->lchild = NULL;
  6. 6 p->rchild = NULL;
  7. 7 if (!T) {
  8. 8 T = p;//为空树
  9. 9 return;
  10. 10 }
  11. 11
  12. 12 if (T->data == elem)
  13. 13 return;//此数已经存在
  14. 14
  15. 15 while (true) {
  16. 16 if (elem > T->data) {
  17. 17 if (T->rchild != NULL)
  18. 18 T = T->rchild;//走到最右端
  19. 19 else {
  20. 20 T->rchild = p;//添加为右子树
  21. 21 return;
  22. 22 }
  23. 23 }
  24. 24 else {
  25. 25 if (T->lchild != NULL)
  26. 26 T = T->lchild;//走到最左端
  27. 27 else {
  28. 28 T->lchild = p;//添加为左子树
  29. 29 return;
  30. 30 }
  31. 31 }
  32. 32 }
  33. 33
  34. 34 }

  二叉树排序:

    通过二叉树的中序遍历,得到的就是一个有序数组

  代码:  

  1. 1 void ShowTree(BiTree *T) {
  2. 2 //进行中序浏览
  3. 3 if (T) {
  4. 4 ShowTree(T->lchild);
  5. 5 cout << T->data << "—>";
  6. 6 ShowTree(T->rchild);
  7. 7 }
  8. 8 }

二叉树查找:

  使用递归,通过比较大小来找到左子树或右子树。

  1463063-20190324160716426-358877850.png

  二叉树查找代码:  

  1. 1 //对二叉树进行查找工作
  2. 2 int SearchData(BiTree *T, int num) {
  3. 3 if (!T)return 0;
  4. 4 if (T->data == num)return 1;
  5. 5 if (num > T->data)SearchData(T->rchild,num);
  6. 6 else SearchData(T->lchild, num);
  7. 7 }

二叉树的删除是重点也是难点:

  当要删除节点位于右端末,即无右子树,则用它的左子树接替他的位置;

    1463063-20190324161221332-1922327002.png

  当要删除节点位于左端末,即无左子树,则用它的右子树接替他的位置;

    1463063-20190324161336043-333377255.png

  当要删除节点位于中间,即既有左子树,又有右子树,用左子树的最大数代替,即左子树的最右端末。

    1463063-20190324161614440-996736554.png

 删除代码:

  1. 1 //进行删除
  2. 2 //重点,也是难点
  3. 3 int Delete(BiTree* &T) {
  4. 4 BiTree *p, *q;
  5. 5 if (T->rchild == NULL) {
  6. //若该结点没有右子树,则将该节点的左子树代替其,并删除
  7. 6 p = T;
  8. 7 T = T->lchild;
  9. 8 delete(p);
  10. 9 }
  11. 10 else if (T->lchild == NULL) {
  12. //若该结点没有左子树,则将该节点的右子树代替其,并删除
  13. 11 p = T;
  14. 12 T = T->rchild;
  15. 13 delete(p);
  16. 14 }
  17. 15 else {
  18. //左右子树都存在
  19. 16 p = T;
  20. 17 q = T->lchild;
  21. 18 while (q->rchild) {
  22. //走到T左支的末端,此时他是左边最大的数
  23. 19 p = q;//记住前端点
  24. 20 q = q->rchild;
  25. 21 }
  26. 22 T->data = q->data;//前驱的数字用最右端数字代替
  27. 23 if (p != T)//将末端的左孩子连接,因为此时他是左端最大的数字
  28. 24 p->rchild = q->lchild;
  29. 25 else
  30. 26 p->lchild = q->lchild;//重接左子树
  31. 27 delete(q);//释放左端最大值
  32. 28 }
  33. 29 return 1;
  34. 30 }
  35. 31
  36. 32
  37. 33 //对二叉树进行删除操作
  38. 34 int DeleteBST(BiTree* &T, int num) {
  39. 35 if (!T)return false;
  40. 36 if (num == T->data) {
  41. 37 Delete(T);
  42. 38 return true;
  43. 39 }
  44. 40 else if (num > T->data)DeleteBST(T->rchild, num);
  45. 41 DeleteBST(T->lchild, num);
  46. 42 }

完整代码:

  

  1. 1 #include "000库函数.h"
  2. 2
  3. 3 #define MAXSIZE 100
  4. 4
  5. 5
  6. 6 //二叉树的结构
  7. 7 struct BiTree
  8. 8 {
  9. 9 int data;
  10. 10 BiTree *lchild, *rchild;
  11. 11 };
  12. 12
  13. 13 //创建二叉树
  14. 14 void InsertBST(BiTree* &T, int elem) {
  15. 15 BiTree *p = new BiTree;
  16. 16 p->data = elem;
  17. 17 p->lchild = NULL;
  18. 18 p->rchild = NULL;
  19. 19 if (!T) {
  20. 20 T = p;//为空树
  21. 21 return;
  22. 22 }
  23. 23
  24. 24 if (T->data == elem)
  25. 25 return;//此数已经存在
  26. 26
  27. 27 while (true) {
  28. 28 if (elem > T->data) {
  29. 29 if (T->rchild != NULL)
  30. 30 T = T->rchild;//走到最右端
  31. 31 else {
  32. 32 T->rchild = p;//添加为右子树
  33. 33 return;
  34. 34 }
  35. 35 }
  36. 36 else {
  37. 37 if (T->lchild != NULL)
  38. 38 T = T->lchild;//走到最左端
  39. 39 else {
  40. 40 T->lchild = p;//添加为左子树
  41. 41 return;
  42. 42 }
  43. 43 }
  44. 44 }
  45. 45
  46. 46 }
  47. 47
  48. 48 void ShowTree(BiTree *T) {
  49. 49 //进行中序浏览
  50. 50 if (T) {
  51. 51 ShowTree(T->lchild);
  52. 52 cout << T->data << "—>";
  53. 53 ShowTree(T->rchild);
  54. 54 }
  55. 55 }
  56. 56
  57. 57 //对二叉树进行查找工作
  58. 58 int SearchData(BiTree *T, int num) {
  59. 59 if (!T)return 0;
  60. 60 if (T->data == num)return 1;
  61. 61 if (num > T->data)SearchData(T->rchild,num);
  62. 62 else SearchData(T->lchild, num);
  63. 63 }
  64. 64
  65. 65
  66. 66 //进行删除
  67. 67 //重点,也是难点
  68. 68 int Delete(BiTree* &T) {
  69. 69 BiTree *p, *q;
  70. 70 if (T->rchild == NULL) {
  71. //若该结点没有右子树,则将该节点的左子树代替其,并删除
  72. 71 p = T;
  73. 72 T = T->lchild;
  74. 73 delete(p);
  75. 74 }
  76. 75 else if (T->lchild == NULL) {
  77. //若该结点没有左子树,则将该节点的右子树代替其,并删除
  78. 76 p = T;
  79. 77 T = T->rchild;
  80. 78 delete(p);
  81. 79 }
  82. 80 else {
  83. //左右子树都存在
  84. 81 p = T;
  85. 82 q = T->lchild;
  86. 83 while (q->rchild) {
  87. //走到T左支的末端,此时他是左边最大的数
  88. 84 p = q;//记住前端点
  89. 85 q = q->rchild;
  90. 86 }
  91. 87 T->data = q->data;//前驱的数字用最右端数字代替
  92. 88 if (p != T)//将末端的左孩子连接,因为此时他是左端最大的数字
  93. 89 p->rchild = q->lchild;
  94. 90 else
  95. 91 p->lchild = q->lchild;//重接左子树
  96. 92 delete(q);//释放左端最大值
  97. 93 }
  98. 94 return 1;
  99. 95 }
  100. 96
  101. 97
  102. 98 //对二叉树进行删除操作
  103. 99 int DeleteBST(BiTree* &T, int num) {
  104. 100 if (!T)return false;
  105. 101 if (num == T->data) {
  106. 102 Delete(T);
  107. 103 return true;
  108. 104 }
  109. 105 else if (num > T->data)DeleteBST(T->rchild, num);
  110. 106 DeleteBST(T->lchild, num);
  111. 107 }
  112. 108
  113. 109 int T032(void)
  114. 110 {
  115. 111 int i;
  116. 112 int a[10] = { 62,88,58,47,35,73,51,99,37,93 };
  117. 113 BiTree *T = new BiTree;
  118. 114 T = NULL;
  119. 115 BiTree *p;
  120. 116 for (i = 0; i < 10; i++) {
  121. 117 InsertBST(T, a[i]);
  122. 118 if (i == 0)
  123. 119 p = T;//记住头结点的位置
  124. 120 T = p;//仍然返回头结点,从头结点开始重新遍历
  125. 121 }
  126. 122 ShowTree(T);
  127. 123 cout << endl;
  128. 124 cout << "找到没?" << endl << SearchData(T, 99) << endl;
  129. 125 p = T;//记住头结点
  130. 126 DeleteBST(T, 93);
  131. 127 T = p;
  132. 128 ShowTree(T);
  133. 129 cout << endl;
  134. 130 p = T;//记住头结点
  135. 131 DeleteBST(T, 37);
  136. 132 T = p;
  137. 133 ShowTree(T);
  138. 134 cout << endl;
  139. 135 return 0;
  140. 136 }

转载于:https://www.cnblogs.com/zzw1024/p/10588656.html

发表评论

表情:
评论列表 (有 0 条评论,286人围观)

还没有评论,来说两句吧...

相关阅读

    相关 查找(排序)

    构造一棵二叉排序树并对其进行中序遍历输出。 在二叉排序树中查找某一关键字,若存在,显示“查找成功”以及查找成功时关键字比较次数;若不存在,将其插入到二叉排序树中,再中序遍历输出

    相关 查找-排序查找

    二叉排序树的性质: (1)若某节点的左子树非空,则左子树上所有元素的值都小于该元素的值。 (2)若某节点的右子树非空,则右子树上所有元素的值都大于该元素的值。 问题:在二