栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

天梯选拔:这是二叉搜索树吗

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

天梯选拔:这是二叉搜索树吗

思路分析:

   这道题主要是根据前序遍历,确定左子树和右子树的范围,然后判断差值如果为1的话,就继续递归。并且每次都要把在递归之后才把当前树的根节点放入到答案数组中。因为这样就是后序遍历。并且这里要分非镜像的和镜像,如果其中一个答案不正确,就做另外一个,如果两个都不正确就直接输出NO,反之输出答案数组。

代码实现:

#include
using namespace std;
int n;
int qian[10010];
int flag=0;
vectora;
void find1(int left, int right) {
if(left>right)return;
       int begin=left+1;
       int end=right;
      while (begin <= right && qian[begin] < qian[left]) begin++;
		while (end > left && qian[end] >= qian[left]) end--;
      if(begin-end!=1)
        return;
       find1(left+1,end);
       find1(begin,right);
       a.push_back(qian[left]);
}
void find(int left, int right) {
if(left>right)return;
       int begin=left+1;
       int end=right;
      while (begin <= right && qian[begin] >= qian[left]) begin++;
		while (end > left && qian[end] < qian[left]) end--;
      if(begin-end!=1)
        return;
       find(left+1,end);
       find(begin,right);
       a.push_back(qian[left]);
}
int main()
{
    cin>>n;
    for(int i=0;i>qian[i];
    
    find1(0,n-1);
    if(a.size()!=n)
    {  
        a.clear();
        find(0,n-1);
    }

    if(a.size()!=n)
      cout<<"NO";
      else {
          cout<<"YES"<::iterator i=a.begin();i!=a.end();i++)
             {
                 if(i!=a.end()-1)
                  cout<<*i<<" ";
                  else cout<<*i;
             }
      }
}
 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/780261.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号