【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;
}
相关文章
|
17天前
[leetcode~dfs]1261. 在受污染的二叉树中查找元素
[leetcode~dfs]1261. 在受污染的二叉树中查找元素
[leetcode~dfs]1261. 在受污染的二叉树中查找元素
|
6月前
|
Python
区间堆(Interval Heap)
区间堆(Interval Heap)是一种基于线段树的数据结构,它可以高效地支持区间查询和修改操作。区间堆的主要应用场景是处理与时间相关的问题,例如区间计数、区间求和等。
93 2
|
7月前
|
调度 Python
区间堆(Interval Heap
区间堆(Interval Heap)是一种优先队列的数据结构,主要用于解决区间相关的问题,如区间调度、区间覆盖等。它可以在 O(log n) 的时间复杂度内完成插入、删除、查询操作。区间堆有两种主要实现方式:线段树和二叉堆。线段树将整个区间分为多个小区间,每个小区间维护一个子堆;二叉堆则使用一颗完全二叉树表示区间堆。
49 0
|
11月前
|
算法
二叉树——堆的排序 TOP-K算法
二叉树——堆的排序 TOP-K算法
|
机器学习/深度学习 存储 算法
【每日算法】 二叉树的垂序遍历的两种方式 :「DFS + 哈希表 + 排序」&「DFS + 优先队列(堆)」 |Python 主题月
【每日算法】 二叉树的垂序遍历的两种方式 :「DFS + 哈希表 + 排序」&「DFS + 优先队列(堆)」 |Python 主题月
【1094】The Largest Generation (树DFS-水题)
基础题。 这类题也是直接DFS,不是像上次的【1079】&【1090】供应树DFS一样是到了叶子结点就进行“更新/结算”类型,这题直接利用DFS统计每层的结点个数即可。
80 0
最小栈 Min_Stack
最小栈 Min_Stack
84 0
最小栈 Min_Stack
LeetCode——路径总和(DFS)
LeetCode——路径总和(DFS)
69 0
LeetCode——路径总和(DFS)
LeetCode 155:最小栈 Min Stack
LeetCode 155:最小栈 Min Stack 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) -- 将元素 x 推入栈中。 pop() -- 删除栈顶的元素。
785 0