國內首套 3 兆瓦風機國產主控系統併網投運:搭載 Linux 實時作業系統,邏輯程式設計軟體完全自主研發
阿新 • • 發佈:2022-01-07
章節涉及
\(\quad\)二叉樹的基本知識,尤其是前序遍歷,中序遍歷,後序遍歷。
基礎知識
\(\quad\)知道前序遍歷和中序遍歷,就能確定後序遍歷
\(\quad\)知道後序遍歷和中序遍歷,就能確定前序遍歷
\(\quad\)知道前序遍歷和後序遍歷,無法確定中序遍歷
應用
應用1
\(\quad\)知道中序遍歷和後序遍歷,求前序遍歷?
\(\quad\)假如中序為 \(ACGDBHZKX\) ,後序 \(CDGAHXKZB\)
\(\quad\)那麼首先確定根為 \(B\) ,在中序遍歷中找到左子樹 \(ACGD\) ,然後在後序中找到左樹 \(CDGA\) ,於是左樹的根節點為 \(A\)
應用2
\(\quad\)給出前序遍歷和後序遍歷,問中序遍歷有幾種可能。
\(\quad\)首先要記住:每個節點的編號不一樣!
\(\quad\)好的,容易發現如果 \(AB\) 在前序遍歷出現,\(BA\) 在後序遍歷出現,那麼這個節點只有 \(1\) 個子節點,記錄下來,這裡有兩種可能。
\(\quad\)最後就是組合數學了。
應用3
Luogu P5018 [NOIP2018 普及組] 對稱二叉樹
#include<bits/stdc++.h> using namespace std; int ans,v[1000010],n; struct { int l,r; }t[2000020]; int size[1000010]; void dfs(int u) { size[u]=1; if(t[u].l!=-1) { dfs(t[u].l); size[u]+=size[t[u].l]; } if(t[u].r!=-1) { dfs(t[u].r); size[u]+=size[t[u].r]; } } bool check(int lson,int rson) { if(lson=-1 && rson=-1) return 1; if(lson!=-1 && rson!=-1 && v[lson]=v[rson] && check(t[lson].l,t[rson].r) && check(t[lson].r,t[rson].l)) return 1; return 0; } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>v[i]; for(int i=1;i<=n;i++) { cin>>t[i].l>>t[i].r; } dfs(1); int ans=0; for(int i=1;i<=n;i++) if(check(t[i].l,t[i].r)) ans=max(ans,size[i]); cout<<ans; return 0; }