• Problem B: 排序二叉树


    Problem Description

    根据输入的int数组建立一棵二叉排序树,然后根据指令进行相应的操作。指令只有两种Insert x, Delete x。不考虑空树的情况。
    Insert x 指令需要你将x插入到建好的二叉排序树中(允许存在相同元素)。
    Delete x 指令需要你将值为x的结点删除(只删除一个,而且不保证x一定在二叉排序树中)。

     

     Input Description

     第一行为测试数据的组数n, 下面有n组测试数据。对于每组测试数据,第一行为用空格隔开的int数列,数量不超过1000,你需要用这个数据初始化一棵排序二叉树,下面一行为指令数m, 接下来的m行为m个指令。格式按照题目描述。数据均为int型。

     

     Output Description

     

    输出一共有n行,对应每组测试数据,在所有的指令都执行完后,把当前的排序二叉树中序输出,元素之间用空格隔开。

    Sample Input

    1. 1
    2. 1 3 5 2
    3. 2
    4. Insert 4
    5. Delete 5

     Sample Output

    1 2 3 4

     Hint

    本题必须用建立二叉排序树的方式做,会检查代码。

     我的想法:

     我的代码:

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. //二叉链表存储表示
    7. typedef struct BSTNode
    8. {
    9. int data;
    10. struct BSTNode *lchild, *rchild;
    11. }BSTNode, *BSTree;
    12. char buffer[100];
    13. //二叉树的插入
    14. void InsertBST(BSTree &T, int e)
    15. {
    16. if (!T)//如果该树为空
    17. {
    18. //创建新的节点
    19. BSTree S = new BSTNode;
    20. S->data = e;
    21. S->lchild = S->rchild = NULL;
    22. T = S;
    23. }
    24. else if (e < T->data)//在左边
    25. {
    26. InsertBST(T->lchild, e);
    27. }
    28. else if (e > T->data)
    29. {
    30. InsertBST(T->rchild, e);
    31. }
    32. }
    33. void DeleteBST(BSTree &T, int key)
    34. {
    35. BSTree p = T;
    36. BSTree f = NULL;
    37. //从根查找关键字等于key的节点
    38. while (p)
    39. {
    40. if (p->data == key)
    41. {
    42. break;
    43. }
    44. f = p;//记录上一个p值
    45. if (key < p->data)
    46. {
    47. p = p->lchild;
    48. }
    49. else if (key > p->data)
    50. {
    51. p = p->rchild;
    52. }
    53. }
    54. if (p == NULL)
    55. {
    56. return;
    57. }
    58. //三种情况:*p左右子树均不为空,无右子树,无左子树
    59. BSTree q = p;
    60. if (p->lchild && p->rchild)
    61. {//左右子树均不为空
    62. BSTree s = p->lchild;
    63. while (s->rchild)
    64. {
    65. q = s;
    66. s = s->rchild;//向右到尽头
    67. }
    68. p->data = s->data;//改变数据,s指向被删节点的前驱
    69. if (q != p)
    70. {
    71. p->rchild = s->lchild;
    72. }
    73. else
    74. {
    75. q->lchild = s->lchild;
    76. }
    77. delete s;
    78. return;
    79. }
    80. else if (!p->rchild)
    81. {
    82. p = p->lchild;
    83. }
    84. else if (!p->lchild)
    85. {
    86. p = p->rchild;
    87. }
    88. if (!f)
    89. {
    90. T = p;
    91. }
    92. else if (q == f->lchild)
    93. {
    94. f->lchild = p;
    95. }
    96. else
    97. {
    98. f->rchild = p;
    99. }
    100. delete q;
    101. }
    102. void Print(BSTree &T)
    103. {
    104. if (!T)
    105. {
    106. return;
    107. }
    108. Print(T->lchild);
    109. printf("%d ", T->data);
    110. Print(T->rchild);
    111. }
    112. int IsNum(char ch)
    113. {
    114. if (ch >= '0' && ch <= '9')
    115. {
    116. return 1;
    117. }
    118. return 0;
    119. }
    120. int GetNum(int &i)
    121. {
    122. int num = 0;
    123. int n = 1;
    124. while (IsNum(buffer[i]))
    125. {
    126. num = num * n + (buffer[i] - '0');
    127. n = 10;
    128. i++;
    129. }
    130. return num;
    131. }
    132. int main()
    133. {
    134. int n, k;//表示有n组测试数据
    135. int elem;
    136. BSTree T = NULL;
    137. cin >> n;
    138. getchar();
    139. while (n--)
    140. {
    141. gets(buffer);
    142. int length = strlen(buffer);
    143. for (int i = 0; i < length; i++)
    144. {
    145. if (IsNum(buffer[i]))
    146. {
    147. int num = GetNum(i);
    148. InsertBST(T, num);
    149. }
    150. }
    151. cin >> k;
    152. string str;
    153. while (k--)
    154. {
    155. cin >> str;
    156. if (str == "Insert")
    157. {
    158. cin >> elem;
    159. InsertBST(T, elem);
    160. }
    161. else
    162. {
    163. cin >> elem;
    164. DeleteBST(T, elem);
    165. }
    166. }
    167. Print(T);
    168. }
    169. return 0;
    170. }

  • 相关阅读:
    北大肖臻老师《区块链技术与应用》系列课程学习笔记[12]以太坊-账户
    机器人控制器编程实践指导书旧版-实践五 数字舵机(执行器)
    English语法_介词 - with
    【PowerMockito:编写单元测试过程中原方法没有注入的属性在跑单元测试时出现空指针】
    在Photoshop上标小图标的操作记录
    第9章 Apache-Dbutils实现CRUD操作
    [GUET-CTF2019]zips
    java基于springboot+vue+elementui的校园志愿者活动管理系统
    GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图
    Haproxy集群
  • 原文地址:https://blog.csdn.net/QQ3503814312/article/details/128025377