日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

PAT甲级1135 Is It A Red-Black Tree (30分):[C++题解]判断红黑树

發(fā)布時(shí)間:2025/4/5 c/c++ 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PAT甲级1135 Is It A Red-Black Tree (30分):[C++题解]判断红黑树 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 題目分析
    • 題目鏈接

題目分析

分析
給定前序遍歷,同時(shí)紅黑樹一定是二叉搜索樹,所以它的中序遍歷就是從小到大排序。因此這道題是給定了前序遍歷和中序遍歷讓建立二叉搜索樹(BST).

數(shù)據(jù)結(jié)構(gòu)中有一類平衡的二叉搜索樹,稱為紅黑樹。
它具有以下 5 個(gè)屬性:
1.節(jié)點(diǎn)是紅色或黑色。
2.根節(jié)點(diǎn)是黑色。
3.所有葉子都是黑色。(葉子是 NULL節(jié)點(diǎn))
4.每個(gè)紅色節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn)都是黑色。
5.從任一節(jié)點(diǎn)到其每個(gè)葉子的所有路徑都包含相同數(shù)目的黑色節(jié)點(diǎn)。

我們需要判斷的就只有三個(gè)條件: 1)根結(jié)點(diǎn)是黑色;2)紅色節(jié)點(diǎn)的兩個(gè)兒子都是黑色;3)點(diǎn)到每個(gè)葉子結(jié)點(diǎn)的路徑包含相同數(shù)目的黑色節(jié)點(diǎn)。

注意,雖然所有節(jié)點(diǎn)的權(quán)值都為正,但是我們使用負(fù)號(hào)表示紅色節(jié)點(diǎn)。

用負(fù)數(shù)表示紅色結(jié)點(diǎn),0和正數(shù)表示黑色結(jié)點(diǎn)。

ac代碼

#include<bits/stdc++.h> using namespace std; const int N = 40;int pre[N],in[N]; unordered_map<int,int> pos; bool ans;//是否是紅黑樹//建立二叉搜索樹,中間判斷是否構(gòu)成紅黑樹 int build(int il ,int ir, int pl ,int pr,int& sum){int root = pre[pl];int k = pos[abs(root)]; //在中序序列中的位置//讀入不構(gòu)成紅黑樹if(k < il || k > ir){ans = false;return 0;}//左子樹的根,右子樹的根int left = 0 ,right = 0; //0和正數(shù)表示黑色int ls = 0 ,rs = 0; //左右子樹中到葉子結(jié)點(diǎn)的黑色節(jié)點(diǎn)個(gè)數(shù)if(il < k) left = build (il,k-1, pl+1, pl+1 +k -1 - il,ls);if(k < ir) right = build(k+1, ir, pl+k-il+1, pr,rs);//走右子樹到葉子結(jié)點(diǎn)的if(ls != rs ) ans = false;sum = ls; //統(tǒng)計(jì)路徑上黑色節(jié)點(diǎn)數(shù)目//根結(jié)點(diǎn)是紅的if(root < 0){//左右子樹不都是黑色的,則不是紅黑樹if(left< 0 || right < 0) ans =false;}//當(dāng)前結(jié)點(diǎn)是黑的else sum ++; //路徑上return root; }int main(){int T;cin>> T;while(T--){int n;cin >> n;for(int i = 0 ;i < n; i++) {cin>> pre[i];in[i] =abs(pre[i]);//讀入數(shù)據(jù)中有負(fù)數(shù),這里讀入絕對(duì)值}sort(in,in+n); //從小到大排序就是中序遍歷pos.clear();for(int i= 0 ;i<n; i++) pos[in[i]] = i;ans = true; //判斷紅黑樹int sum=0; //統(tǒng)計(jì)到葉子結(jié)點(diǎn)黑色節(jié)點(diǎn)的數(shù)量//返回根結(jié)點(diǎn)int root = build(0 ,n -1, 0 ,n-1,sum);//根結(jié)點(diǎn)是紅色的,不是紅黑樹if(root < 0) ans =false;if(ans) cout<<"Yes"<<endl;else cout<<"No"<<endl;} }

題目鏈接

PAT甲級(jí)1135 Is It A Red-Black Tree (30分)
acwing1628. 判斷紅黑樹

總結(jié)

以上是生活随笔為你收集整理的PAT甲级1135 Is It A Red-Black Tree (30分):[C++题解]判断红黑树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。