PAT A1043 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 theMirror Imageof 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 integerN(≤1000). ThenNinteger 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 lineYES
if the sequence is the preorder traversal sequence of a BST or the mirror image of a BST, orNO
if not. Then if the answer isYES
, 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:
7
8 6 5 7 10 8 11
Sample Output 1:
YES
5 7 6 8 11 10 8
Sample Input 2:
7
8 10 11 8 6 7 5
Sample Output 2:
YES
11 8 10 7 5 6 8
Sample Input 3:
7
8 6 8 5 10 9 11
Sample Output 3:
NO
注意点
- 本题的意思是将输入的序列构造为二叉查找树,并判断该序列是否与该树的先序遍历或先序遍历的镜像一致,一致则输出yes,并打印该树的后序遍历或后序遍历的镜像。
- 起初比较两个序列是否相同时,考虑的是一般数组,但这种方法比较麻烦。使用vector型数组可以直接比较,方便使用。
代码
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
struct node
{
int data;
node* lchild;
node* rchild;
};
node* newNode(int x)
{
node* root = new node;
root -> data = x;
root -> lchild = NULL;
root -> rchild = NULL;
return root;
}
void insert(node* &root , int x)
{
if (root == NULL)
{
root = newNode(x);
return;
}
if (x < root -> data)
insert(root -> lchild, x);
else
insert(root -> rchild, x);
}
//先序
void preOrder(node* root, vector<int>& vi)
{
if (root == NULL) return;
vi.push_back(root -> data);
preOrder(root -> lchild, vi);
preOrder(root -> rchild, vi);
}
//镜像先序
void preOrderMirror(node* root, vector<int>& vi)
{
if (root == NULL) return;
vi.push_back(root -> data);
preOrderMirror(root -> rchild, vi);
preOrderMirror(root -> lchild, vi);
}
//后续遍历
void postOrder(node* root, vector<int>& vi)
{
if (root == NULL) return;
postOrder(root -> lchild, vi);
postOrder(root -> rchild, vi);
vi.push_back(root -> data);
}
// 镜像树后序
void postOrderMirror(node* root, vector<int>& vi)
{
if (root == NULL) return;
postOrderMirror(root -> rchild, vi);
postOrderMirror(root -> lchild, 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", &data);
origin.push_back(data);
insert(root, data);
}
preOrder(root, pre);
preOrderMirror(root, preM);
postOrder(root, post);
postOrderMirror(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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。