PAT甲级1135 Is It A Red-Black Tree (30分):[C++题解]判断红黑树
文章目錄
- 題目分析
- 題目鏈接
題目分析
分析
給定前序遍歷,同時(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT甲级1123 Is It a Co
- 下一篇: PAT甲级1053 Path of Eq