PAT甲级1135 Is It A Red-Black Tree (30分):[C++题解]判断红黑树
生活随笔
收集整理的這篇文章主要介紹了
PAT甲级1135 Is It A Red-Black Tree (30分):[C++题解]判断红黑树
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 題目分析
- 題目鏈接
題目分析
分析
給定前序遍歷,同時紅黑樹一定是二叉搜索樹,所以它的中序遍歷就是從小到大排序。因此這道題是給定了前序遍歷和中序遍歷讓建立二叉搜索樹(BST).
數據結構中有一類平衡的二叉搜索樹,稱為紅黑樹。
它具有以下 5 個屬性:
1.節點是紅色或黑色。
2.根節點是黑色。
3.所有葉子都是黑色。(葉子是 NULL節點)
4.每個紅色節點的兩個子節點都是黑色。
5.從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。
我們需要判斷的就只有三個條件: 1)根結點是黑色;2)紅色節點的兩個兒子都是黑色;3)點到每個葉子結點的路徑包含相同數目的黑色節點。
注意,雖然所有節點的權值都為正,但是我們使用負號表示紅色節點。
用負數表示紅色結點,0和正數表示黑色結點。
ac代碼
#include<bits/stdc++.h> using namespace std; const int N = 40;int pre[N],in[N]; unordered_map<int,int> pos; bool ans;//是否是紅黑樹//建立二叉搜索樹,中間判斷是否構成紅黑樹 int build(int il ,int ir, int pl ,int pr,int& sum){int root = pre[pl];int k = pos[abs(root)]; //在中序序列中的位置//讀入不構成紅黑樹if(k < il || k > ir){ans = false;return 0;}//左子樹的根,右子樹的根int left = 0 ,right = 0; //0和正數表示黑色int ls = 0 ,rs = 0; //左右子樹中到葉子結點的黑色節點個數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);//走右子樹到葉子結點的if(ls != rs ) ans = false;sum = ls; //統計路徑上黑色節點數目//根結點是紅的if(root < 0){//左右子樹不都是黑色的,則不是紅黑樹if(left< 0 || right < 0) ans =false;}//當前結點是黑的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]);//讀入數據中有負數,這里讀入絕對值}sort(in,in+n); //從小到大排序就是中序遍歷pos.clear();for(int i= 0 ;i<n; i++) pos[in[i]] = i;ans = true; //判斷紅黑樹int sum=0; //統計到葉子結點黑色節點的數量//返回根結點int root = build(0 ,n -1, 0 ,n-1,sum);//根結點是紅色的,不是紅黑樹if(root < 0) ans =false;if(ans) cout<<"Yes"<<endl;else cout<<"No"<<endl;} }題目鏈接
PAT甲級1135 Is It A Red-Black Tree (30分)
acwing1628. 判斷紅黑樹
總結
以上是生活随笔為你收集整理的PAT甲级1135 Is It A Red-Black Tree (30分):[C++题解]判断红黑树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT甲级1123 Is It a Co
- 下一篇: PAT甲级1053 Path of Eq