欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

笛卡尔树 (25 分)笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2。首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树则大。其次所有结点的K2关键字

发布时间:2024/2/28 编程问答 45 豆豆

立志用最少的代码做最高效的表达


笛卡尔树是一种特殊的二叉树,其结点包含两个关键字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关键字的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。