PTA P9 中序遍历树并判断是否为二叉搜索树

本文介绍了一种通过中序遍历来判断给定二叉树是否为二叉搜索树的方法,并提供了两种不同的实现方案,一种是使用映射存储节点关系,另一种则是传统的构建二叉树结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对给定的有N个节点(N>=0)的二叉树,给出中序遍历序列,并判断是否为二叉搜索树。

题目保证二叉树不超过200个节点,节点数值在整型int范围内且各不相同。

输入格式:
第一行是一个非负整数N,表示有N个节点

第二行是一个整数k,是树根的元素值

接下来有N-1行,每行是一个新节点,格式为r d e 三个整数,

r表示该节点的父节点元素值(保证父节点存在);d是方向,0表示该节点为父节点的左儿子,1表示右儿子;e是该节点的元素值

输出格式:
首先输出二叉树的中序遍历序列,每个元素占一行。对于空树,不输出任何内容。

然后如果给定的树是二叉搜索树,输出Yes 否则输出No

输入样例:
fig.jpg

对于图片中的二叉树:

3
20
20 0 10
20 1 25
输出样例:
10
20
25
Yes

//P9 中序遍历树并判断是否为二叉搜索树
#include<iostream>
#include<map>
#include<vector>
using namespace std;
map<int,map<int,int>> p;
vector<int> v;
bool flag=true;
void bl(int k){
	if(k){
		bl(p[k][0]);
		cout<<k<<endl;
		v.push_back(k);
		bl(p[k][1]);
	}
}
int main()
{
	int n,k;
	cin>>n>>k;
	if(n==0)
	{
		cout<<"Yes\n";
		return 0;
	}
	for(int i=0;i<n-1;i++)
	{
		int r,d,e;
		cin>>r>>d>>e;
		p[r][d]=e;
	}
	bl(k);
	for(int i=0;i<v.size()-1;i++)
	if(v[i]>=v[i+1])
	flag=false;
	if(flag)
	cout<<"Yes\n";
	else
	cout<<"No\n";
}

上面这个只是题目的一种解法而已,显然和题目给人的印象解法不同。也是顺便复习一下,加深下影响,楼主用正规的解法,也就是建树的方式来解答此题。

```cpp
//P9的常规解法
#include<iostream>
#include<vector>
using namespace std;
vector<int> v;
int r;
typedef struct tree* BT;
struct tree{
	int data;
	BT left;
	BT right;
};
BT wz=new tree();// wz用来记住r的位置 
void insert(BT root)
{
	if(root){
		insert(root->left);
		if(root->data==r)
		{
			wz=root;
			return;
		}
		insert(root->right);
	}	
}
void bl(BT root)
{
	if(root){
		bl(root->left);
		cout<<root->data<<endl;
		v.push_back(root->data);
		bl(root->right);
	}
}
int main()
{
	int n,k;
	cin>>n;
	if(n==0)
	{
		cout<<"Yes\n";
		return 0;
	}
	cin>>k;
	BT root=new tree();
	root->data=k;
	root->left=NULL;
	root->right=NULL;
	for(int i=0;i<n-1;i++)
	{
		int d,e;
		cin>>r>>d>>e;
		BT node=new tree();
		insert(root);
		node=wz;
		if(d==0)
		{
			BT t=new tree();
			node->left=t;
			t->data=e;
			t->left=NULL;
			t->right=NULL;
		}
		else
		{
			BT t=new tree();
			node->right=t;
			t->data=e;
			t->left=NULL;
			t->right=NULL;
		}
	}
	bl(root);
	bool flag=true;
	for(int i=0;i<v.size()-1;i++)
	{
		if(v[i]>=v[i+1])
		flag=false;
	}
	if(flag)
	cout<<"Yes\n";
	else
	cout<<"No\n";
} 


这就是常规解法了,没什么提示的,就是注意空树也是二叉搜索树就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值