本专栏持续输出数据结构题目集,欢迎订阅。
题目
对于二叉查找树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉查找树。
现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉查找树或某镜像二叉查找树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。
输入格式:
输入的第一行包含一个正整数 n(≤1000),第二行包含 n 个整数,为给出的整数键值序列,数字间以空格分隔。
输出格式:
输出的第一行首先给出判断结果,如果输入的序列是某棵二叉查找树或某镜像二叉查找树的前序遍历序列,则输出YES,否侧输出NO。如果判断结果是YES,下一行输出对应二叉树的后序遍历序列。数字间以空格分隔,但行尾不能有多余的空格。
输入样例1:
7
8 6 5 7 10 8 11
输出样例1:
YES
5 7 6 8 11 10 8
输入样例2:
7
8 6 8 5 10 9 11
输出样例2:
NO
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 存储后序遍历结果
int* postOrder;
int postIndex;
// 检查是否为二叉查找树的前序遍历,并生成后序遍历
int isBST(int* pre, int start, int end) {
if (start > end) return 1;
// 根节点值
int root = pre[start];
// 找到第一个大于或等于根节点的元素索引,作为右子树的起点
int i;
for (i = start + 1; i <= end; i++) {
if (pre[i] >= root) {
break;
}
}
// 检查右子树是否都大于或等于根节点
int j;
for (j = i; j <= end; j++) {
if (pre[j] < root) {
return 0;
}
}
// 递归检查左子树和右子树
int left = isBST(pre, start + 1, i - 1);
int right = isBST(pre, i, end);
// 如果是BST,将根节点加入后序遍历结果
if (left && right) {
postOrder[postIndex++] = root;
return 1;
} else {
return 0;
}
}
// 检查是否为镜像二叉查找树的前序遍历,并生成后序遍历
int isMirrorBST(int* pre, int start, int end) {
if (start > end) return 1;
// 根节点值
int root = pre[start];
// 找到第一个小于根节点的元素索引,作为右子树的起点
int i;
for (i = start + 1; i <= end; i++) {
if (pre[i] < root) {
break;
}
}
// 检查右子树是否都小于根节点
int j;
for (j = i; j <= end; j++) {
if (pre[j] >= root) {
return 0;
}
}
// 递归检查左子树和右子树
int left = isMirrorBST(pre, start + 1, i - 1);
int right = isMirrorBST(pre, i, end);
// 如果是镜像BST,将根节点加入后序遍历结果
if (left && right) {
postOrder[postIndex++] = root;
return 1;
} else {
return 0;
}
}
int main() {
int n;
scanf("%d", &n);
int* pre = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
scanf("%d", &pre[i]);
}
postOrder = (int*)malloc(n * sizeof(int));
postIndex = 0;
// 先尝试判断是否为二叉查找树
int isBSTree = isBST(pre, 0, n - 1);
// 如果不是,尝试判断是否为镜像二叉查找树
if (!isBSTree) {
postIndex = 0; // 重置后序遍历索引
isBSTree = isMirrorBST(pre, 0, n - 1);
}
// 输出结果
if (isBSTree) {
printf("YES\n");
for (int i = 0; i < n; i++) {
if (i > 0) {
printf(" ");
}
printf("%d", postOrder[i]);
}
printf("\n");
} else {
printf("NO\n");
}
return 0;
}
1986






