• 数据结构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. }

     

     

  • 相关阅读:
    JAVASE语法零基础——抽象类和接口
    【web渗透】SSRF漏洞超详细讲解
    mysql—各种函数的使用
    shell脚本
    从 C# 崩溃异常 中研究页堆布局
    保姆级思路教程 使用selenium + 简易爬虫 爬取课程网站未完成作业的清单
    基于约束的装配设计【CadQuery】
    面试问题之如何解释微服务
    Visual Studio 2019部署桌面exe(笔记)
    Linux SDIO-WiFi 协议栈
  • 原文地址:https://blog.csdn.net/weixin_58073817/article/details/127721696