笛卡爾樹是一種特殊的二叉樹,其結點包含兩個關鍵字k1和k2。首先笛卡爾樹是關於k1的二叉搜尋樹,即結點左子樹的所有k1值都比該結點的k1值小,右子樹則大。其次所有結點的k2關鍵字滿足優先佇列(不妨設為最小堆)的順序要求,即該結點的k2值比其子樹中所有結點的k2值小。給定一棵二叉樹,請判斷該樹是否笛卡爾樹。
輸入首先給出正整數n(\le
≤1000),為樹中結點的個數。隨後n行,每行給出乙個結點的資訊,包括:結點的k1值、k2值、左孩子結點編號、右孩子結點編號。設結點從0~(n-1)順序編號。若某結點不存在孩子結點,則該位置給出-1−1
。輸出yes
如果該樹是一棵笛卡爾樹;否則輸出no
。
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
輸出yes
如果該樹是一棵笛卡爾樹;否則輸出no
。yes
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
no
k1滿足二叉搜尋樹,但k2不滿足最小堆順序
k2滿足最小堆順序,但k1不滿足二叉搜尋樹
k2滿足最小堆順序;k1的每個子樹都滿足二叉搜尋樹條件,但整棵樹不滿足二叉搜尋樹條件
最小n最大n隨機
///**書寫的新姿勢
#include#define bug() puts("*****************");
using namespace std;
const int maxn = 1100;
int n;
int k1[maxn],k2[maxn],fa[maxn],lch[maxn],rch[maxn];
int getroot()
bool ktwo(int root)
bool judge(int root)
return ktwo(root); //判斷k2
}int main(){
scanf("%d",&n);
for(int i=0;i
笛卡爾樹小結
粗略的學習了一下笛卡爾樹 主要是為了平衡樹打基礎吧 因為關於平衡樹 treap 早忘了 splay 不信任複雜度 然後 我能學一種比較簡單的樹y 笛卡爾樹.這裡以建出小根堆為例。描述區間性質的樹 可以當成二叉搜尋樹不過並不平衡因為每次都是選取當前區間最小值當做為根 然後顯然根據區間的數的排列不同樹的...
笛卡爾 關於笛卡爾
陪孩子看書看到笛卡爾,突然想到了笛卡爾積以及cross join等等,無法忽視的數學之美。關於笛卡爾發明座標系還有這樣乙個故事 有一天,笛卡爾 1596 1650,法國哲學家 數學家 物理學家 生病臥床,但他頭腦一直沒有休息,在反覆思考乙個問題 幾何圖形是直觀的,而代數方程則比較抽象,能不能用幾何圖...
笛卡爾樹學習筆記
笛卡爾樹學習筆記 笛卡爾樹是一種二叉樹,每乙個結點由乙個鍵值二元組 k,w 構成。要求 k 滿足二叉搜尋樹的性質,而 w 滿足堆的性質。乙個有趣的事實是,如果笛卡爾樹的 k,w 鍵值確定,且 k 互不相同,w 互不相同,那麼這個笛卡爾樹的結構是唯一的 在一般情況下,未說明 k 時,我們預設 k 為下...