【1155】Heap Paths (30分)【DFS回溯&堆】

简介: 【1155】Heap Paths (30分)【DFS回溯&堆】【1155】Heap Paths (30分)【DFS回溯&堆】
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>  
#include<map>
#include<vector>
#include<queue> 
using namespace std;  
int n,a[1009];
vector<int> v;//保存一路上的结点
int isMin=1,isMax=1;
/* 题意:
给⼀完全二叉树,打印从根到所有叶的路径,打印顺序先右后左,即先序
遍历的镜像,判断该树是啥种堆
分析:
1.dfs打印出所有路路径(从右往左,即先序的镜像),vector保存一路上的节点,通过push和
pop回溯,维护路径
2.判断是否为堆:从第2个节点开始遍历,若比父节点大则非小顶堆,若比父节点大则非大顶堆*/
//level order traversal是层序遍历~BFS
//堆is一棵完全二叉树
void dfs(int index){
  if(index>n) 
        return;//判断是否为空结点
  if(index *2>n && index*2+1>n){//判断是否为叶结点,不用判断右子结点也可
    //if(index <=n){//对只有左叶结点没有右叶结点的点的特判
      for(int i=0;i<v.size();i++)
        printf("%d%s",v[i], i!= v.size()-1 ? " " :"\n");
    //}
  }else{ //此处也可以没有else,但要在上面的if结尾加return
    v.push_back(a[index *2 +1]);
    dfs(index*2+1);
    v.pop_back();
    v.push_back(a[index*2]);
    dfs(index*2);
    v.pop_back();
  }
}
int main(){   
  cin >> n;
  for(int i=1;i<=n;i++)
    scanf("%d",&a[i]);//存入BFS序列
  v.push_back(a[1]); 
  dfs(1);
  for(int i=2;i<=n;i++){
    if(a[i/2] > a[i])  isMin=0;
    if(a[i/2] < a[i])  isMax=0;
  }
  if(isMin == 1)
    printf("Min Heap");
  else 
    printf("%s",isMax ==1 ? "Max Heap" :"Not Heap");
  system("pause");
  return 0;
}
相关文章
|
4月前
|
存储 算法 C语言
【practise】最小栈
【practise】最小栈
|
6月前
|
人工智能 算法 Java
深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。
深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。
|
Python
区间堆(Interval Heap)
区间堆(Interval Heap)是一种基于线段树的数据结构,它可以高效地支持区间查询和修改操作。区间堆的主要应用场景是处理与时间相关的问题,例如区间计数、区间求和等。
158 2
|
Python
配对堆(Pairing Heap
配对堆(Pairing Heap)是一种基于二叉堆的可并堆数据结构,它的主要特点是每个节点都有两个子节点,分别称为左子节点和右子节点。配对堆支持插入、查询最小值、合并和修改元素等操作。它具有速度快和结构简单的优势,但由于其为基于势能分析的均摊复杂度,无法可持久化。
138 0
|
调度 Python
区间堆(Interval Heap
区间堆(Interval Heap)是一种优先队列的数据结构,主要用于解决区间相关的问题,如区间调度、区间覆盖等。它可以在 O(log n) 的时间复杂度内完成插入、删除、查询操作。区间堆有两种主要实现方式:线段树和二叉堆。线段树将整个区间分为多个小区间,每个小区间维护一个子堆;二叉堆则使用一颗完全二叉树表示区间堆。
98 0
|
存储 资源调度 调度
配对堆(Pairing heap
配对堆(Pairing heap)是一种优先队列的数据结构,它的主要特点是每个节点可以有一个优先级,元素的优先级可以是任意的,可以是整数、浮点数或其他类型。配对堆支持插入、删除最小元素(即弹出最小元素)、查找最小元素以及调整优先级等操作。它具有堆的性质,即任意节点的优先级大于等于(或小于等于)其子节点优先级。
123 0
|
C++
【PAT甲级 - C++题解】1155 Heap Paths
【PAT甲级 - C++题解】1155 Heap Paths
67 0
二叉树——堆的排序 TOP-K算法
二叉树——堆的排序 TOP-K算法
LeetCode 155:最小栈 Min Stack
LeetCode 155:最小栈 Min Stack 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) -- 将元素 x 推入栈中。 pop() -- 删除栈顶的元素。
803 0