搜索数判断

题目为PTA上的搜索树判断问题(gplt)
判断二叉搜索树及镜像二叉搜索树,并输出对应二叉树的后序遍历。

全部测试点已过
7-12 搜索树判断 (25 分)
对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。

现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。

输入格式:
输入的第一行包含一个正整数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

测试点三没过
16
100 70 60 62 68 65 69 200 150 140 160 155 300 400 500 450
YES
65 69 68 62 60 70 140 155 160 150 450 500 400 300 200 100

主要是因为当二叉树为以下形状时,



/ 、
这种情况下没有进行测试,所以没有发现此处的问题。当序列中某一子段后面几个数都小于第一个数时,这时不应直接记录后面的几个数为结果。应该对其再次判断。代码中的final problem处即为解决。



//GPLT 搜索二叉树及镜像搜索二叉树的判断并且输出后序遍历序列

#include <iostream>
#include<algorithm>
#include<vector>

using namespace std;


int n;
int temp[1010];
vector<int> tree;
vector<int> tree2;


bool judge(int x, int len)
{

	//没有元素不应入栈-----1
	if (len <= x)
	{
		return true;
	}
	tree.push_back(temp[x]);
	for (int i = x + 1; i < len; i++)
	{
		if (temp[i] >= temp[x])
		{
			for (int k = i + 1; k < len; k++)
			{
				if (temp[k] < temp[x])
				{
					return false;
				}
			}
			//cout << temp[x] << endl;
			if (judge(i, len) && judge(x + 1, i))
			{
				return true;
			}//------------------4--错误树的判断返回
			else
			{
				return false;
			}
		}
	}
	//------------------2
	if (judge(x + 1, len))
	{
		return true;
	}
	else
	{
		return false;
	}
	
}


//判断镜像搜索二叉树
bool judge2(int x, int len)
{
	if (len <= x)
	{
		return true;
	}
	tree2.push_back(temp[x]);
	for (int i = x + 1; i < len; i++)
	{
		if (temp[i] < temp[x])
		{
			for (int k = i + 1; k < len; k++)
			{
				if (temp[k] >= temp[x])
				{
					return false;
				}
			}
			if (judge2(i, len) && judge2(x + 1, i))//不能写成judge哦----3
			{
				return true;
			}
			else
			{
				return false;
			}
		}
	}

	///-----------------应继续检查final problem(☆)
	if (judge2(x + 1, len))
	{
		return true;
	}
	else
	{
		return false;
	}
}


int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> temp[i];
	}
	if (judge(0, n))
	{
		cout << "YES" << endl;
		for (int i = tree.size() - 1; i > 0; i--)
		{
			cout << tree[i] << " ";
		}
		cout << tree[0];

	}
	else if (judge2(0, n))
	{
		cout << "YES" << endl;
		for (int i = tree2.size() - 1; i > 0; i--)
		{
			cout << tree2[i] << " ";
		}
		cout << tree2[0];
	}
	else {
		cout << "NO\n";
	}
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值