给出N个正整数来作为一棵二叉排序树的结点插入顺序,问这串序列是否是该二叉排序树的先序序或是该二叉排序树的镜像树的先序序列。
题解: #include<cstdio> #include<vector> using namespace std; struct node{ int data; node *left,*right; }; void insert(node *&root,int data){ if(root==NULL){ root=new node; root->data=data; root->left=root->right=NULL; return; } if(data<root->data)insert(root->left, data); else insert(root->right,data); } void preOrder(node*root,vector<int>& vi){ if(root==NULL)return; vi.push_back(root->data); preOrder(root->left,vi); preOrder(root->right, vi); } void preOrderMirror(node* root,vector<int>& vi){ if(root==NULL) return; vi.push_back(root->data); preOrderMirror(root->right, vi); preOrderMirror(root->left, vi); } void postOrder(node* root,vector<int>&vi){ if(root==NULL)return; postOrder(root->left,vi); postOrder(root->right,vi); vi.push_back(root->data); } void postOrderMirror(node*root,vector<int>&vi){ if(root==NULL)return; postOrderMirror(root->right,vi); postOrderMirror(root->left,vi); vi.push_back(root->data); } vector<int>origin,pre,preM,post,postM; int main(){ int n,data; node*root=NULL; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&n); origin.push_back(data); insert(root,data); } preOrder(root,pre); preOrderMirror(root, preM); postOrder(root,post); preOrderMirror(root,postM); if(origin==pre){ printf("YES\n"); for(int i=0;i<post.size();i++){ printf("%d",post[i]); if(i<post.size()-1)printf(" "); } }else if(origin==preM){ printf("YES\n"); for(int i=0;i<postM.size();i++){ printf("%d",postM[i]); if(i<postM.size()-1)printf(" "); } }else{ printf("NO\n"); } return 0; }
给出N个正整数来作为一棵二叉排序树的结点插入顺序,问这串序列是否是该二叉排序树的先序序列或是该二叉排序树的镜像树的先序序列。
于 2022-09-18 13:26:09 首次发布