PTAL2-004 这是二叉搜索树吗解题报告---二叉搜索树的建立 & 左右节点交换 & 先序 & 后序遍历

版权声明:转载请注明出处:https://blog.csdn.net/qq1013459920 https://blog.csdn.net/qq1013459920/article/details/85120635

                           L2-004 这是二叉搜索树吗?(25 分)

一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,

  • 其左子树中所有结点的键值小于该结点的键值;
  • 其右子树中所有结点的键值大于等于该结点的键值;
  • 其左右子树都是二叉搜索树。

所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。

给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。

输入格式:

输入的第一行给出正整数 N(≤1000)。随后一行给出 N 个整数键值,其间以空格分隔。

输出格式:

如果输入序列是对一棵二叉搜索树或其镜像进行前序遍历的结果,则首先在一行中输出 YES ,然后在下一行输出该树后序遍历的结果。数字间有 1 个空格,一行的首尾不得有多余空格。若答案是否,则输出 NO

输入样例 1:

7
8 6 5 7 10 8 11

输出样例 1:

YES
5 7 6 8 11 10 8

输入样例 2:

7
8 10 11 8 6 7 5

输出样例 2:

YES
11 8 10 7 5 6 8

输入样例 3:

7
8 6 8 5 10 9 11

输出样例 3:

NO

考查对二叉搜索树的基本理解 

 AC Code:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<string>
#include<cctype>
#include<map>
#include<vector>
#include<string>
#include<queue>
#include<stack>
#define INF 0x3f3f3f3f
using namespace std;
static const int MAX_N = 1e5 + 5;
typedef long long ll;
struct  BST{
	int weight;
	BST *lson, *rson;
};
queue<int> Q1;	//记录先序遍历节点
queue<int> Q2;	//记录后序遍历节点
void PreOrder(BST *T){	//先序遍历
	if (!T) return;
	Q1.push(T->weight);
	PreOrder(T->lson);
	PreOrder(T->rson);
}
void LaterOrder(BST *T) {	//后序遍历
	if (!T) return;
	LaterOrder(T->lson);
	LaterOrder(T->rson);
	Q2.push(T->weight);
}
void insert(BST * &T, int weight) {	//二叉树的建立
	if (!T) {
		T = (BST *)malloc(sizeof(BST));
		T->weight = weight;
		T->lson = NULL;
		T->rson = NULL;
	}
	else {
		if (weight >= T->weight) {
			insert(T->rson, weight);
		}
		else {
			insert(T->lson, weight);
		}
	}
}
void Swap(BST * &T) {	//交换左右节点
	if (!T) return;
	Swap(T->lson);
	Swap(T->rson);
	BST *temp = T->lson;
	T->lson = T->rson;
	T->rson = temp;
}
int main(){
	int n;
	int vv[1005];
	BST *root = NULL;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &vv[i]);
		insert(root, vv[i]);
	}
	PreOrder(root);
	bool flag = true;
	for (int i = 0; i < n; i++) {	//二叉树先序遍历是否符合输入顺序
		int v2 = Q1.front();
		Q1.pop();
		if (vv[i] != v2) {
			flag = false;
			break;
		}
	}
	while (!Q1.empty()) Q1.pop();
	if (flag) {
		printf("YES\n");
		LaterOrder(root);
		while (Q2.size() > 1) {
			printf("%d ", Q2.front());
			Q2.pop();
		}
		printf("%d\n", Q2.front());
		Q2.pop();
	}
	else {
		Swap(root);		//二叉树镜像
		PreOrder(root);
		flag = true;
		for (int i = 0; i < n; i++) {	//二叉树镜像先序遍历是否符合输入顺序
			int v2 = Q1.front();
			Q1.pop();
			if (v2 != vv[i]) {	
				flag = false;
				break;
			}
		}
		while (!Q1.empty()) Q1.pop();
		if (flag) {
			printf("YES\n");
			LaterOrder(root);	//后序遍历 & 打印
			while (Q2.size() > 1) {
				printf("%d ", Q2.front());
				Q2.pop();
			}
			printf("%d\n", Q2.front());
			Q2.pop();
		}
		else printf("NO\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq1013459920/article/details/85120635