上海简站商贸有限公司著名的国外设计网站有哪些
上海简站商贸有限公司,著名的国外设计网站有哪些,广州建网站开发seo型企业网站,you物公馆网站建设一棵二叉搜索树可被递归地定义为具有下列性质的二叉树#xff1a;对于任一结点#xff0c;
其左子树中所有结点的键值小于该结点的键值#xff1b; 其右子树中所有结点的键值大于等于该结点的键值#xff1b; 其左右子树都是二叉搜索树。 所谓二叉搜索树的“镜像”#x…一棵二叉搜索树可被递归地定义为具有下列性质的二叉树对于任一结点
其左子树中所有结点的键值小于该结点的键值 其右子树中所有结点的键值大于等于该结点的键值 其左右子树都是二叉搜索树。 所谓二叉搜索树的“镜像”即将所有结点的左右子树对换位置后所得到的树。
给定一个整数键值序列现请你编写程序判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。
输入格式 输入的第一行给出正整数 N≤1000。随后一行给出 N 个整数键值其间以空格分隔。
输出格式 如果输入序列是对一棵二叉搜索树或其镜像进行前序遍历的结果则首先在一行中输出 YES 然后在下一行输出该树后序遍历的结果。数字间有 1 个空格一行的首尾不得有多余空格。若答案是否则输出 NO。
题解
因为给了前序遍历所以根据前序遍历求出后序遍历如果前序遍历的大小等于后序遍历说明后序遍历是存在的记得题目说了存在镜像情况所以要求两个后序遍历有一组满足情况即可
代码
#includebits/stdc.h
using namespace std;
const int maxn1e38;
vectorintpost;
bool iff0;
int pre[maxn];
void getpost(int l,int r)
{if(lr)return ;int il1,jr;if(!iff){while(irpre[l]pre[i])i;while(jlpre[l]pre[j])j--;}else {while(irpre[l]pre[i])i;while(jlpre[l]pre[j])j--;}if(i!j1)return ;getpost(l1,j);
// printf(l%d r%d pre[l]%d\n-------\n,l,r,pre[l]);getpost(i,r);
// printf(l%d r%d pre[l]%d\n,l,r,pre[l]);post.push_back(pre[l]);
}
int main()
{int n;cinn;for(int i0;in;i)cinpre[i];getpost(0,n-1);if(post.size()!n){iff1;post.clear();getpost(0,n-1);}if(post.size()!n)coutNOendl;else {coutYESendl;for(int i0;in;i){if(i!n-1)coutpost[i] ;else coutpost[i];} }return 0;}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/89316.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!