笛卡尔树 ← AcWing 4279

【题目来源】
https://www.acwing.com/problem/content/4282/

【题目描述】
笛卡尔树是由一系列不同数字构成的二叉树。
笛卡尔树满足堆的性质,笛卡尔树的中序遍历序列为构建其的原始序列。
最小堆笛卡尔树表示满足小根堆性质的笛卡尔树。
例如,给定序列 {8,15,3,4,1,5,12,10,18,6},则生成的最小堆笛卡尔树如图所示。

现在,给定一个长度为 N 的原始序列,请你生成最小堆笛卡尔树,并输出其层序遍历序列。

【输入格式】
第一行包含整数 N。
第二行包含 N 个两两不同的整数,表示原始序列。

【输出格式】
共一行,输出最小堆笛卡尔树的层序遍历序列。

【数据范围】
1≤N≤30,
原始序列中元素的取值范围 [−2147483648,2147483647]。

【输入样例】
10
8 15 3 4 1 5 12 10 18 6

【输出样例】
1 3 5 8 4 6 15 10 12 18

【算法分析】
● 深度优先搜索(dfs)的本质是递归。
● 深度优先搜索(dfs)函数通过添加一个 rank 形参,可以实现层序遍历。
● 声明一个 vector 数组,将每层的结点分别存到不同的 vector 里。

【算法代码】

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

const int maxn=35;

vector<int> v[maxn];
int a[maxn];

void dfs(int le,int ri,int rank) {
    if(le>=ri) return;
    int mid=le;
    for(int i=le; i<ri; i++) {
        if(a[i]<a[mid]) mid=i;
    }
    v[rank].push_back(a[mid]);

    dfs(le,mid,rank+1);
    dfs(mid+1,ri,rank+1);
}

int main() {
    int n;
    cin>>n;
    for(int i=0; i<n; i++) cin>>a[i];

    dfs(0,n,1);

    for(auto x:v) {
        for(int i=0; i<x.size(); i++) {
            cout<<x[i]<<" ";
        }
    }

    return 0;
}

/*
in:
10
8 15 3 4 1 5 12 10 18 6

out:
1 3 5 8 4 6 15 10 12 18
*/

【参考文献】
https://www.acwing.com/solution/content/121940/
https://www.acwing.com/solution/content/121219/
https://blog.csdn.net/weixin_73897131/article/details/128652831

相关推荐
源代码•宸1 天前
Leetcode—94. 二叉树的中序遍历【简单】
经验分享·后端·算法·leetcode·职场和发展·golang·dfs
源代码•宸2 天前
Leetcode—144. 二叉树的前序遍历【简单】
经验分享·算法·leetcode·面试·职场和发展·golang·dfs
不穿格子的程序员2 天前
从零开始写算法——图论篇2:课程表 + 实现前缀树(26叉树)
算法·深度优先·图论·dfs·bfs
少许极端2 天前
算法奇妙屋(二十六)-二叉树的深度搜索问题
算法·二叉树·dfs
老鼠只爱大米3 天前
LeetCode经典算法面试题 #104:二叉树的最大深度(深度优先搜索、广度优先搜索等多种实现方案详细解析)
算法·leetcode·二叉树·dfs·bfs·深度优先搜索·广度优先搜索
不穿格子的程序员3 天前
从零开始写算法——图论篇1:岛屿数量 + 腐烂的橘子
算法·深度优先·图论·dfs·bfs
源代码•宸6 天前
Leetcode—404. 左叶子之和【简单】
经验分享·后端·算法·leetcode·职场和发展·golang·dfs
源代码•宸7 天前
Leetcode—513. 找树左下角的值【中等】
经验分享·算法·leetcode·面试·职场和发展·golang·dfs
不穿格子的程序员8 天前
从零开始写算法——回溯篇4:分割回文串 + N皇后
算法·深度优先·dfs
π同学11 天前
基于RT-Thread的STM32开发第十二讲SD卡篇——DFS文件系统
stm32·dfs·rtthread·sdio