笛卡尔树 (25 分)笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2。首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树则大。其次所有结点的K2关键字
立志用最少的代码做最高效的表达
笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2。首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树则大。其次所有结点的K2关键字满足优先队列(不妨设为最小堆)的顺序要求,即该结点的K2值比其子树中所有结点的K2值小。给定一棵二叉树,请判断该树是否笛卡尔树。
输入格式:
输入首先给出正整数N(≤1000),为树中结点的个数。随后N行,每行给出一个结点的信息,包括:结点的K1值、K2值、左孩子结点编号、右孩子结点编号。设结点从0~(N-1)顺序编号。若某结点不存在孩子结点,则该位置给出−1。
输出格式:
输出YES如果该树是一棵笛卡尔树;否则输出NO。
输入样例1:
6
8 27 5 1
9 40 -1 -1
10 20 0 3
12 21 -1 4
15 22 -1 -1
5 35 -1 -1
输出样例1:
YES
输入样例2:
6
8 27 5 1
9 40 -1 -1
10 20 0 3
12 11 -1 4
15 22 -1 -1
50 35 -1 -1
输出样例2:
NO
分别判断是否为小根堆和二叉平衡树即可。
判断小根堆:是否是一个递增的序列
判断二叉平衡树:中序序列是否为一个递增的序列。
#include<iostream> #include<cstdio> #include<vector> using namespace std;int n; struct node{int k1, k2;int left, right; }nod[1010]; int vis[1010]; //找根节点 //判断是否为二叉搜索树:判断其中序序列是否为递增。 vector<int>in; void isBst(int root) {if(nod[root].left != -1) isBst(nod[root].left);in.push_back(nod[root].k1);if(nod[root].right != -1) isBst(nod[root].right); } bool isBST(int root) {isBst(root);for(int i = 0; i < n-1; i++) if(in[i] > in[i+1]) return false;return true; }int isMinHeap(int root) {if(root == -1) return 1;if(nod[root].left != -1) if(nod[nod[root].left].k2 < nod[root].k2 || !isMinHeap(nod[root].left)) return 0;if(nod[root].right != -1) if(nod[nod[root].right].k2 < nod[root].k2 || !isMinHeap(nod[root].right)) return 0;return 1; }int main() {cin >> n;for(int i = 0; i < n; i++) {cin >> nod[i].k1 >> nod[i].k2 >> nod[i].left >> nod[i].right;if(nod[i].left != -1) vis[nod[i].left] = 1;if(nod[i].right != -1) vis[nod[i].right] = 1;; }int root = 0;for(int i = 0; i < n; i++) if(vis[i] == 0) root = i;cout << ((isBST(root) && isMinHeap(root)) ? "YES\n" : "NO\n"); return 0; }
耗时
总结
以上是生活随笔为你收集整理的笛卡尔树 (25 分)笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2。首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树则大。其次所有结点的K2关键字的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 【测试点4】基础实验4-2.8 部落 (
- 下一篇: 哥尼斯堡的“七桥问题” (25 分)【欧