对给定的有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";
}
这就是常规解法了,没什么提示的,就是注意空树也是二叉搜索树就好了。