L2-004. 这是二叉搜索树吗?

来源:互联网 发布:北京行知实验小学咋样 编辑:程序博客网 时间:2024/05/29 18:50

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

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

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

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

输入格式:

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

输出格式:

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

输入样例1:
78 6 5 7 10 8 11
输出样例1:
YES5 7 6 8 11 10 8
输入样例2:
78 10 11 8 6 7 5
输出样例2:
YES11 8 10 7 5 6 8
输入样例3:
78 6 8 5 10 9 11
输出样例3:
NO
我用的最简单的方法,直接用前序遍历的输入构造二叉搜索树,因为有的有镜像,所以左右都构造一遍,对比一下结果,后序遍历也是,输出一遍,代码比较多,但是复制粘贴就可以,也不难理解
#include<iostream>#include<cstdio>#include<vector>using namespace std;struct node{int num;struct node* left;struct node* right;};struct node* insert(struct node * root,int n){if(root==NULL){root=new node();root->left=NULL;root->right=NULL;root->num=n;}else if(root->num>n){root->left=insert(root->left,n);}else if(root->num<=n){root->right=insert(root->right,n);}return root;}vector<int>res1,res2,res3;void preorder1(struct node* root){if(root==NULL)return;res1.push_back(root->num);preorder1(root->left);preorder1(root->right);}void preorder2(struct node* root){if(root==NULL)return;res2.push_back(root->num);preorder2(root->right);preorder2(root->left);}vector<int>res4;void hostorder(struct node* root){if(root==NULL)return;hostorder(root->left);hostorder(root->right);res4.push_back(root->num);}void hostorder2(struct node* root){if(root==NULL)return;hostorder2(root->right);hostorder2(root->left);res4.push_back(root->num);}int main(){int n;scanf("%d",&n);struct node* root=NULL;for(int i=0;i<n;i++){int num;scanf("%d",&num);res3.push_back(num);root=insert(root,num);}preorder1(root);preorder2(root);bool flag=false;int i;for(i=0;i<res1.size();i++){if(res1[i]!=res3[i]){break;}}if(i==res1.size()){printf("YES\n");hostorder(root);for(int j=0;j<res4.size()-1;j++){printf("%d ",res4[j]);}printf("%d\n",res4[res4.size()-1]);return 0;}for(i=0;i<res2.size();i++){if(res2[i]!=res3[i]){break;}}if(i==res2.size()){printf("YES\n");hostorder2(root);for(int j=0;j<res4.size()-1;j++){printf("%d ",res4[j]);}printf("%d\n",res4[res4.size()-1]);return 0;}printf("NO\n");return 0;} 


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 两岁宝宝入睡难怎么办 吃激素掉发严重怎么办 20多岁掉头发怎么办 最近头发老掉怎么办20 20多岁最近严重脱发怎么办 头痒头皮屑多掉头发怎么办 有头屑头痒掉头发怎么办 老是头痒掉头发怎么办 头屑头痒掉头发怎么办 头痒头屑多掉头发怎么办 洗头发时总是掉发怎么办 染头发染到脸上洗不掉怎么办 总爱掉头发怎么办20岁 头发开叉长的慢怎么办 洗头时掉很多头发怎么办 出门前头发很油怎么办 关于头发头顶头发少怎么办 每天掉100根头发怎么办 小孩嘴巴烂了该怎么办 小孩吃烧烤嘴巴肿好大该怎么办 脸特别瘦的人怎么办 怀孕宝宝太懒了怎么办 奶油胶手机壳脏了怎么办 为什么电脑桌面壁纸变成黑色怎么办 仓鼠妈妈老忘了宝宝怎么办 木工三排多轴钻床气缸坏了怎么办? 水溶笔洗不掉怎么办 针管笔没有墨了怎么办 二岁小儿不爱吃饭怎么办 狗狗一直挠痒痒怎么办 手被铅笔扎了怎么办 小孩智力轻度低下该怎么办 发侮辱人的信息怎么办 宋民国表情我能怎么办 苹果手机微信弄成听筒模式怎么办 我的小可爱丢了怎么办 法斗犬老是皮肤病看也看不好怎么办 项链水晶不亮了怎么办 美甲画画手抖怎么办 微信中的表情符号不全怎么办 球球大作战找不到团战服务器怎么办