首页 > 其他分享 >二叉搜索树

二叉搜索树

时间:2024-01-28 11:44:39浏览次数:14  
标签:head int 样例 二叉 tail 键值 搜索

7-2 这是二叉搜索树吗? 分数 25 作者 陈越 单位 浙江大学

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

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

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

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

输入格式:

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

输出格式:

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

输入样例 1:

7
8 6 5 7 10 8 11

输出样例 1:

YES
5 7 6 8 11 10 8

输入样例 2:

7
8 10 11 8 6 7 5

输出样例 2:

YES
11 8 10 7 5 6 8

输入样例 3:

7
8 6 8 5 10 9 11

输出样例 3:

NO
代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB  
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<stdlib.h> 
using namespace std;
int n,m;
const int N = 1010000;
int a[N];
vector<int>vec;
void dfs(int head, int tail) {
    if (head > tail) return;
    int l, r;
    l = head + 1;
    r = tail;
    while (a[l] < a[head] && l <= tail)l++;//到第一个大于等于枢轴的点右边可以越界,保证最后l>r
    while (a[r] >= a[head] && r > head)r--;//到第一个小于枢轴的点
    if (l - r != 1)return;//确保成立
    dfs(head + 1, r);//递归传递,最后入vector 后序遍历
    dfs(l, tail);
    vec.push_back(a[head]);
}
//同理
void dfs2(int head, int tail) {
    if (head > tail) return;
    int l, r;
    l = head + 1;
    r = tail;
    while (a[l] >= a[head] && l <= tail)l++;
    while (a[r] < a[head] && r > head)r--;
    if (l - r != 1)return;
    dfs2(head + 1, r);
    dfs2(l, tail);
    vec.push_back(a[head]);
}

int main()
{
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n;
    for (int i = 0; i < n; i++) cin >> a[i];
    dfs(0, n - 1);
    if (vec.size() != n) {
        vec.clear();
        dfs2(0, n - 1);
    }
    if (vec.size() == n) {
        cout << "YES" << endl;
        int f = 0;
        for (int i = 0; i < n; i++) {
            if (f == 1)cout << " ";
            cout << vec[i] ;
            f = 1;
        }
        cout << endl;
    }
    else {
        cout << "NO" << endl;
    }
    return 0;
}

https://blog.csdn.net/m0_46201544/article/details/123714620?

 

 

标签:head,int,样例,二叉,tail,键值,搜索
From: https://www.cnblogs.com/daimazhishen/p/17992655

相关文章

  • GPS信号的数字接收处理matlab仿真,包括频率点搜索,捕获跟踪,相关峰检测等步骤
    1.算法运行效果图预览 低信噪比下仿真结果如下:  2.算法运行软件版本matlab2022a 3.算法理论概述        GPS(全球定位系统)信号的数字接收处理是GPS接收机核心技术之一,它涉及到从接收到的卫星信号中提取导航数据和解算出位置信息的一系列处理过程。这个......
  • 递归搜索文件
    1publicstaticvoidmain(String[]args){2searchFile(newFile("F:/"),"logFile-data.log");3}45privatestaticvoidsearchFile(Filefile,StringfileName){6//判断file是否是目录7if(file!=......
  • 【树】二叉树的应用 I
    目录1.题目列表2.应用2.1.Leetcode226.翻转二叉树2.1.1.题目2.1.2.解题思路2.1.2.1.方法一:前序遍历2.1.2.2.方法二:后序遍历2.1.3.代码实现2.2.Leetcode116.填充每个节点的下一个右侧节点指针2.2.1.题目2.2.2.解题思路2.2.2.1.方法一:广度优先搜索2.2.2.2.方法二:深......
  • 如何学习算法:什么时完全二叉树?完全二叉树有什么特点?
    完全二叉树我们知道树是一种非线性数据结构。它对儿童数量没有限制。二叉树有一个限制,因为树的任何节点最多有两个子节点:左子节点和右子节点。什么是完全二叉树?完全二叉树是一种特殊类型的二叉树,其中树的所有级别都被完全填充,除了最低级别的节点从尽可能左侧填充之外。完全二叉树的......
  • 35. 搜索插入位置
    1.题目介绍2.题解2.1二分查找(递归实现)思路利用递归+二分查找实现对于目标数target索引位置(存在)或者插入位置的索引(不存在)1.递归返回条件:left>right,在通过二分法寻找到最接近target的值nums[mid]依旧不等于target,也就是left==right的情况依旧不满足,说明数组中并不存在t......
  • Easysearch:语义搜索、知识图和向量数据库概述
    什么是语义搜索?语义搜索是一种使用自然语言处理算法来理解单词和短语的含义和上下文以提供更准确的搜索结果的搜索技术。旨在更好地理解用户的意图和查询内容,而不仅仅是根据关键词匹配,还通过分析查询的语义和上下文来提供更准确和相关的搜索结果。传统的关键词搜索主要依赖于对关键......
  • Easysearch:语义搜索、知识图和向量数据库概述
    什么是语义搜索?语义搜索是一种使用自然语言处理算法来理解单词和短语的含义和上下文以提供更准确的搜索结果的搜索技术。旨在更好地理解用户的意图和查询内容,而不仅仅是根据关键词匹配,还通过分析查询的语义和上下文来提供更准确和相关的搜索结果。传统的关键词搜索主要依赖于对......
  • 将关键词优化到搜索引擎首页的方法?
    将关键词优化到搜索引擎首页的方法?下面跟北京wordpress建站公司小编一起来了解详细内容:新手在做网站SEO优化时,如何提高网站首页的关键词排名?其实这也很简单,就是优化用户喜欢的内容到搜索引擎首页,这样网站才能有更好的排名,并吸引更多准确的用户流量。在资金充足的情况下......
  • 搜索推荐DeepFM算法详解:算法原理、代码实现、比赛实战
    搜索推荐DeepFM算法详解:算法原理、代码实现、比赛实战可以说,DeepFM是目前最受欢迎的CTR预估模型之一,不仅是在交流群中被大家提及最多的,同时也是在面试中最多被提及的:1、Deepfm的原理,DeepFM是一个模型还是代表了一类模型,DeepFM对FM做了什么样的改进,FM的公式如何化简并求......
  • SAP dialog 自定义搜索帮助 案例+源码
    同之前的blog一样,新建一个9000的屏幕,元素清单配好ok_code即可前置准备准备一个屏幕,具体步骤和之前一样,这边也按步骤做一下状态栏因为这个只是用于搜索帮助的演示,所以不需要应用应用程序工具栏,只需要设置功能键方便返回测试即可标题9000程序PROCESSBEFOREOUTPUT.......