• 数据结构day44


    总结:今天时间不多,先不做复习题了;

    题目详情 - 1043 Is It a Binary Search Tree (pintia.cn)

    思路:首先假设是BST,用序列分别建立BST和MIRROR_BST树,和先序比较,一样就yes,不然no; 对比一下答案的思路,用vector比较是否一样更简洁;

    1. #include<iostream>
    2. #include<cmath>
    3. #include<vector>
    4. #include<algorithm>
    5. #pragma warning(disable:4996)
    6. using namespace std;
    7. struct node {
    8. int data;
    9. node* left;
    10. node* right;
    11. };
    12. vector<int>original, pre, preM, res;
    13. void insert(node*& root, int data) {
    14. if (root == NULL) {
    15. root = new node;
    16. root->data = data;
    17. root->left = root->right = NULL;
    18. }
    19. else if (root->data > data) {
    20. insert(root->left, data);
    21. }
    22. else
    23. {
    24. insert(root->right, data);
    25. }
    26. }
    27. void pre_traverse(node* root,vector<int>&v,int flag) {//flag==1 is BSI, 0 is mirror
    28. if (root == NULL) {
    29. return;
    30. }
    31. v.push_back(root->data);
    32. if (flag) {
    33. pre_traverse(root->left, v, flag);
    34. pre_traverse(root->right, v, flag);
    35. }
    36. else
    37. {
    38. pre_traverse(root->right, v, flag);
    39. pre_traverse(root->left, v, flag);
    40. }
    41. }
    42. void post_traverse(node* root, vector<int>& v,int flag) {
    43. if (root == NULL) {
    44. return;
    45. }
    46. if (flag) {
    47. if (root->left) {
    48. post_traverse(root->left, v,flag);
    49. }
    50. if (root->right) {
    51. post_traverse(root->right, v,flag);
    52. }
    53. v.push_back(root->data);//直接打印也可以
    54. }
    55. else
    56. {
    57. if (root->right) {
    58. post_traverse(root->right, v, flag);
    59. }
    60. if (root->left) {
    61. post_traverse(root->left, v, flag);
    62. }
    63. v.push_back(root->data);//直接打印也可以
    64. }
    65. }
    66. int main() {
    67. node* root = NULL;
    68. int n, data;
    69. cin >> n;
    70. for (int i = 0; i < n; i++) {
    71. cin >> data;
    72. original.push_back(data);
    73. insert(root, data);
    74. }
    75. pre_traverse(root, pre, 1);
    76. pre_traverse(root, preM, 0);
    77. if (original == pre) {
    78. cout << "YES\n";
    79. post_traverse(root, res,1);
    80. for (int i = 0; i < res.size(); i++) {
    81. if (i != 0) {
    82. cout << ' ';
    83. }
    84. cout << res[i];
    85. }
    86. }
    87. else if (original == preM) {
    88. cout << "YES\n";
    89. post_traverse(root, res,0);
    90. for (int i = 0; i < res.size(); i++) {
    91. if (i != 0) {
    92. cout << ' ';
    93. }
    94. cout << res[i];
    95. }
    96. }
    97. else
    98. {
    99. cout << "NO\n";
    100. }
    101. return 0;
    102. }

    题目详情 - 1064 Complete Binary Search Tree (pintia.cn) 

    思路:理解了接近一小时,给定序列,排序后可知树的中序遍历,然后因为是完全二叉树,所以已知每个节点的位置;最后在递归,在比节点小的放在2*i位置,节点在i,比节点大的放在2*i+1位置;希望下次写有新的理解,还有需要复习中序和三种其他遍历建树的写法;

    1. #include<iostream>
    2. using namespace std;
    3. #include<algorithm>
    4. int arr[1001], res[1001], n, index;
    5. void in_traverse(int root) {
    6. if (root > n) {
    7. return;
    8. }
    9. in_traverse(2 * root);//root从1开始
    10. res[root] = arr[index++];//找位置,从小到大
    11. in_traverse(2 * root + 1);
    12. }
    13. int main()
    14. {
    15. cin >> n;
    16. for (int i = 0; i < n; i++) {
    17. cin >> arr[i];
    18. }
    19. sort(arr, arr + n);//in_order traverse
    20. in_traverse(1);
    21. for (int i = 1; i <= n; i++) {
    22. if (i != 1) {
    23. cout << " ";
    24. }
    25. cout << res[i];
    26. }
    27. return 0;
    28. }

     

     

  • 相关阅读:
    基于SSM+MySQL+Bootstrap的员工信息管理系统
    软件测试(测试用例攻略)—写用例无压力
    【面试题精讲】说一说springboot加载配置文件优先级
    含文档+PPT+源码等]精品基于Nodejs实现的商品|物品交互|互换平台[包运行成功]
    Vue3 如何实现一个全局搜索框
    【C++】手搓读写properties文件源码
    Leetcode—392.判断子序列【简单】
    第13章 网络安全漏洞防护技术原理与应用
    【华为机试真题】组成最大数【2022 Q3 | 100分】
    Go Web——http标准库
  • 原文地址:https://blog.csdn.net/weixin_58073817/article/details/127721696