PTA这是二叉搜索树吗?

一、题目描述

 

 二、解题思路

  首先根据他的原规则建树,然后根据原规则相反建树。最后遍历这两棵树中是否有一颗的前序和输入序列相同,相同就输出这棵树的后序。题目很简单,就是做起来挺麻烦的。

三、代码实现

  1 #include "bits/stdc++.h"
  2 using namespace std;
  3 struct node{
  4     int val;
  5     node *left;
  6     node *right;
  7 };
  8 int tree[1010];
  9 vector <int> ans1;
 10 vector <int> ans2;
 11 vector <int> ans3;
 12 node *create1(node *root,int val)
 13 {
 14     if(root == NULL){
 15         root = new node();
 16         root->val = val;
 17         return root;
 18     }
 19     if(val >= root->val)
 20         root->right = create1(root->right,val);
 21     else
 22         root->left = create1(root->left,val);
 23     return root;
 24 }
 25 node *create2(node *root,int val)
 26 {
 27     if(root == NULL){
 28         root = new node();
 29         root->val = val;
 30         return root;
 31     }
 32     if(val >= root->val)
 33         root->left = create2(root->left,val);
 34     else
 35         root->right = create2(root->right,val);
 36     return root;
 37 }
 38 void pre(node *root,int key)
 39 {
 40     if(root == NULL)
 41         return;
 42     if(key == 1)
 43         ans1.push_back(root->val);
 44     else
 45         ans2.push_back(root->val);
 46     pre(root->left,key);
 47     pre(root->right,key);
 48 }
 49 void Aft(node *root)
 50 {
 51     if(root == NULL)
 52         return;
 53     Aft(root->left);
 54     Aft(root->right);
 55     ans3.push_back(root->val);
 56 }
 57 int main()
 58 {
 59     int n;
 60     node *T1 = NULL;
 61     node *T2 = NULL;
 62     cin >> n;
 63     for(int i = 1;i <= n;i++){
 64         cin >> tree[i];
 65         T1 = create1(T1,tree[i]);
 66         T2 = create2(T2,tree[i]);
 67     }
 68     pre(T1,1);
 69     pre(T2,2);
 70     bool ok1,ok2;
 71     ok1 = ok2 = true;
 72     for(int i = 0;i < n;i++){
 73         if(ans1[i] != tree[i + 1])
 74             ok1 = false;
 75         if(ans2[i] != tree[i + 1])
 76             ok2 = false;
 77         if(!ok1 && !ok2)
 78             break;
 79     }
 80     if(ok1 || ok2){
 81         cout << "YES" << endl;
 82         if(ok1){
 83             Aft(T1);
 84             int len = 1;
 85             for(auto u:ans3){
 86                 if(len != n)
 87                     cout << u << ' ';
 88                 else
 89                     cout << u << endl; 
 90                 len++;
 91             }
 92         }
 93         else {
 94             Aft(T2);
 95             int len = 1;
 96             for(auto u:ans3){
 97                 if(len != n)
 98                     cout << u << ' ';
 99                 else
100                     cout << u << endl; 
101                 len++;
102             }
103         }
104     }
105     else
106         cout << "NO" << endl;
107     return 0;
108 }
posted @ 2022-03-19 16:11  scannerkk  阅读(54)  评论(0)    收藏  举报