7-31 笛卡尔树 (25分)--判断二叉搜索树,小顶堆

先初步判断是否满足二叉搜索树和小顶堆(针对每一颗最小的子树),如果都满足,进一步判断整棵树是否满足。

  1 #include <iostream>
  2 #include <string>
  3 #include <cstring>
  4 using namespace std;
  5 typedef struct node
  6 {
  7     int K1;
  8     int K2;
  9     int L;
 10     int R;
 11 }node_arr[1001];
 12 node_arr s;
 13 int n;
 14 int f[1001];//存放前驱结点,判断是否为小顶堆的时候用到
 15 int f_is_BST1 = 0;
 16 int f_greater1 = 0;
 17 int f_greater2 = 0;
 18 void is_BST1(int i)//二叉搜索树的初步判断
 19 {
 20     if (s[i].L != -1)
 21     {
 22         if (s[i].K1 > s[s[i].L].K1)
 23         {
 24             is_BST1(s[i].L);
 25         }
 26         else
 27         {
 28             f_is_BST1 = 1;
 29             return;
 30         }
 31     }
 32     if (s[i].R != -1)
 33     {
 34         if (s[i].K1 <= s[s[i].R].K1)
 35         {
 36             is_BST1(s[i].R);
 37         }
 38         else
 39         {
 40             f_is_BST1 = 1;
 41             return;
 42         }
 43     }
 44 }
 45 void is_greater1(int i)//小顶堆的初步判断
 46 {
 47     if (s[i].L != -1)
 48     {
 49         if (s[i].K2 <= s[s[i].L].K2)
 50         {
 51             is_greater1(s[i].L);
 52         }
 53         else
 54         {
 55             f_greater1 = 1;
 56             return;
 57         }
 58     }
 59     if (s[i].R != -1)
 60     {
 61         if (s[i].K2 <= s[s[i].R].K2)
 62         {
 63             is_greater1(s[i].R);
 64         }
 65         else
 66         {
 67             f_greater1 = 1;
 68             return;
 69         }
 70     }
 71 }
 72 void is_greater2()//小顶堆进一步判断(整棵树)
 73 {
 74     for (int i = 0; i < n; i++)
 75     {
 76         int j = i;
 77         while (f[j] != -1)
 78         {
 79             if (s[f[j]].K2 > s[j].K2)
 80                 f_greater2 = 1;
 81             j = f[j];
 82         }
 83     }
 84 }
 85 bool is_BST2(int x, int min, int max)//搜索树进一步判断(整棵树)
 86 {
 87     if (x == -1)return true;
 88     if (s[x].K1 > max || s[x].K1 < min) return false;
 89     return (is_BST2(s[x].L, min, s[x].K1 - 1) && is_BST2(s[x].R, s[x].K1, max));
 90 }
 91 int main()
 92 {
 93     int r[1001] = { 0 };
 94     cin >> n;
 95     for (int i = 0; i < n; i++)f[i] = -1;
 96     for (int i = 0; i < n; i++)
 97     {
 98         struct node temp;
 99         cin >> temp.K1 >> temp.K2 >> temp.L >> temp.R;
100         if (temp.L != -1)
101         {
102             f[temp.L] = i;
103             r[temp.L] = 1;
104         }
105         if (temp.R != -1)
106         {
107             f[temp.R] = i;
108             r[temp.R] = 1;
109         }
110         s[i] = temp;
111     }
112     int root;
113     for (int i = 0; i < n; i++)
114     {
115         if (r[i] == 0)root = i;
116     }
117     for (int i = 0; i < n; i++)
118         is_BST1(i);
119     is_greater1(0);
120     is_greater2();
121     if (f_is_BST1 == 0 && f_greater1 == 0)
122         if (f_greater2 == 1 || is_BST2(root, -32767, 32767) == false)
123             cout << "NO";
124         else
125             cout << "YES";
126     else
127     {
128         cout << "NO";
129     }
130     return 0;
131 }

原文地址:https://www.cnblogs.com/2020R/p/12590987.html

时间: 2024-10-10 07:37:49

7-31 笛卡尔树 (25分)--判断二叉搜索树,小顶堆的相关文章

PAT 天梯赛 是否同一棵二叉搜索树&#160;&#160;&#160;(25分)(二叉搜索树)

给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果.于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树. 输入格式: 输入包含若干组测试数据.每组数据的第1行给出两个正整数NNN (≤10\le 10≤10)和LLL,分别是每个序列插入元素的个数和需要检查的序列个数.第2行给出NNN个以空格分隔的正整数,作为初始插入序列.最后LL

PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由

<pre class="code"><span style="font-family: %value; font-size: 14px;">03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. Input Specification: Each inpu

[剑指offer] 判断二叉搜索树的后序遍历序列

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 输入描述 整数数组 输出描述 布尔值 题目分析 什么是二叉搜索树? 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二

判断二叉搜索树的后序遍历序列

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析:采用递归的思想,先找出根节点,左子树元素都必须比根节点小,右子树节点都比根节点大,否则返回false. 得到子树(子序列)的两种方法: ①用下标把数组 逻辑分为几个子数组(这里采用的是这种) ②用工具类Arrays把数组分割 public class Solution {    public boolean VerifySquenceOfBST(int

AVL树——高度平衡的二叉搜索树

1 #pragma once 2 3 #include<stack> 4 5 template<class Type> 6 class AVLTree; 7 8 template<class Type> 9 class AVLNode 10 { 11 friend class AVLTree<Type>; 12 public: 13 AVLNode() : data(Type()),leftChild(NULL),rightChild(NULL),bf(0)

树&#183;二叉查找树ADT(二叉搜索树/排序树)

1.定义 对于每个节点X,它的左子树中所有的项的值小于X的值,右子树所有项的值大于X的值. 如图:任意一个节点,都满足定义,其左子树的所有值小于它,右子树的所有值大于它. 2.平均深度 在大O模型中,二叉查找树的平均深度是O(logN) . 证明:查找某个节点x的算法深度,即从根出发找到节点x的路径长.所有查找的平均深度,就是平均内部路径长. 假设二叉查找树共N个节点,假设左子树有i个节点,则右子树节点数目:N-i-1. 假设D(N)表示具有N个基点的内部路径长.则N个节点的树的内部路径长:D(

构造并判断二叉搜索树-js

class Node { constructor (val) { this.val = val this.left = this.right = undefined } } class Tree { constructor (data) { let root = new Node(data.shift()) // 遍历所有的数据 data.forEach(item => { this.insert(root, item) }) return root } insert (node, data)

[hdu1506 Largest Rectangle in a Histogram]笛卡尔树

题意:http://acm.hdu.edu.cn/showproblem.php?pid=1506 如图,求最大的矩形面积 思路: 笛卡尔树:笛卡尔树是一棵二叉树,树的每个节点有两个值,一个为key,一个为value.光看key的话,笛卡尔树是一棵二叉搜索树,每个节点的左子树的key都比它小,右子树都比它大:光看value的话,笛卡尔树有点类似堆,根节点的value是最小(或者最大)的,每个节点的value都比它的子树要小(或者大). 笛卡尔树的构造算法:从右链插入,同时维护右链的递增或递减序列

笛卡尔树cartesian tree

笛卡尔树cartesian tree 笛卡尔树是一种特定的二叉树数据结构,可由数列构造,在范围最值查询.范围top k查询(range top k queries)等问题上有广泛应用.它具有堆的有序性,中序遍历可以输出原数列.笛卡尔树结构由Vuillmin(1980)[1]在解决范围搜索的几何数据结构问题时提出.从数列中构造一棵笛卡尔树可以线性时间完成,需要采用基于栈的算法来找到在该数列中的所有最近小数. 定义 无相同元素的数列构造出的笛卡尔树具有下列性质: 结点一一对应于数列元素.即数列中的每