1043. Is It a Binary Search Tree
来源:互联网 发布:塑料蒸锅有毒吗 知乎 编辑:程序博客网 时间:2024/05/16 05:01
1043. Is It a Binary Search Tree (25)
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:
- The left subtree of a node contains only nodes with keys less than the node's key.
- The right subtree of a node contains only nodes with keys greater than or equal to the node's key.
- Both the left and right subtrees must also be binary search trees.
If we swap the left and right subtrees of every node, then the resulting tree is called the Mirror Image of a BST.
Now given a sequence of integer keys, you are supposed to tell if it is the preorder traversal sequence of a BST or the mirror image of a BST.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (<=1000). Then N integer keys are given in the next line. All the numbers in a line are separated by a space.
Output Specification:
For each test case, first print in a line "YES" if the sequence is the preorder traversal sequence of a BST or the mirror image of a BST, or "NO" if not. Then if the answer is "YES", print in the next line the postorder traversal sequence of that tree. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.
Sample Input 1:78 6 5 7 10 8 11Sample Output 1:
YES5 7 6 8 11 10 8Sample Input 2:
78 10 11 8 6 7 5Sample Output 2:
YES11 8 10 7 5 6 8Sample Input 3:
78 6 8 5 10 9 11Sample Output 3:
NO
#include<stdio.h>#include<iostream>#include<algorithm>#include<string>using namespace std;struct Node{int data;Node* lchild;Node* rchild;}Tree[1002];int loc;int Pre[1002];//先序 int In[1002];//中序 int ans[1002];bool cmp(int x, int y){return x > y;}Node* create(){Tree[loc].lchild = NULL;Tree[loc].rchild = NULL;return &Tree[loc ++];}int index = 0;void postOrder(Node* root){if(root->lchild != NULL)postOrder(root->lchild);if(root->rchild != NULL)postOrder(root->rchild);ans[index ++] = root->data;}Node* build(int s1, int e1, int s2, int e2){if(e1 - s1 != e2 - s2)return NULL;Node *p = create();p->data = Pre[s1];int root_idx = -1;for(int i = s2; i <= e2; i ++){if(In[i] == Pre[s1]){root_idx = i;break;}}if(root_idx == -1)return NULL;if(root_idx != s2)p->lchild = build(s1 + 1, s1 + root_idx - s2, s2, root_idx - 1);if(root_idx != e2)p->rchild = build(s1 + root_idx - s2 + 1, e1, root_idx + 1, e2);return p;}Node* newbuild(int s1, int e1, int s2, int e2){if(e1 - s1 != e2 - s2)return NULL;Node* p = create();p->data = Pre[s1];int root_idx = -1;for(int i = e2; i >= s2; i --){if(In[i] == Pre[s1]){root_idx = i;break;}}if(root_idx == -1)return NULL;if(root_idx != s2)p->lchild = build(s1 + 1, s1 + root_idx - s2, s2, root_idx - 1);if(root_idx != e2)p->rchild = build(s1 + root_idx - s2 + 1, e1, root_idx + 1, e2);return p;}int main(){freopen("F://Temp/input.txt", "r", stdin);int n;scanf("%d", &n);for(int i = 0; i < n; i ++){cin>>Pre[i];In[i] = Pre[i];}sort(In, In + n);loc = 0;Node* root = build(0, n - 1, 0, n - 1);postOrder(root);if(index < n){sort(In, In + n, cmp);index = 0;root = newbuild(0, n - 1, 0, n - 1);postOrder(root);}if(index == n){cout<<"YES"<<endl;for(int i = 0; i < n; i ++){if(i == 0)cout<<ans[i];elsecout<<" "<<ans[i];}}elsecout<<"NO";cout<<endl;return 0;}
- 1043. Is It a Binary Search Tree
- 1043. Is It a Binary Search Tree
- 1043. Is It a Binary Search Tree
- 1043.Is It a Binary Search Tree
- 1043. Is It a Binary Search Tree
- 1043. Is It a Binary Search Tree
- 1043. Is It a Binary Search Tree
- 1043. Is It a Binary Search Tree
- 1043. Is It a Binary Search Tree
- 1043. Is It a Binary Search Tree
- 1043. Is It a Binary Search Tree
- 1043. Is It a Binary Search Tree
- PAT A 1043. Is It a Binary Search Tree (25)
- PAT-A-1043. Is It a Binary Search Tree (25)
- pat-a 1043. Is It a Binary Search Tree (25)
- Is It a Binary Search Tree (25)
- PAT_1043. Is It a Binary Search Tree
- 1043. Is It a Binary Search Tree (25)
- java多线程
- Linux个人常用命令
- 什么是Oracle Solaris zones?
- LINUX C语言 DNS
- 将android studio项目转换成eclipse
- 1043. Is It a Binary Search Tree
- js对象属性 通过点(.) 和 方括号([]) 的不同之处
- 【android】listView的item失去焦点不能点击
- 不走寻常路—访问Zoho研发中心有感
- 怎样写基于GPIO子系统的外接传感器的驱动
- Axure编辑函数大全
- 图像二值化、腐蚀、操作、闭操作与开操作
- block strong
- 我对自己的选择没有后悔、没有失望—兄弟会