1. 程式人生 > 資訊 >國內首套 3 兆瓦風機國產主控系統併網投運:搭載 Linux 實時作業系統,邏輯程式設計軟體完全自主研發

國內首套 3 兆瓦風機國產主控系統併網投運:搭載 Linux 實時作業系統,邏輯程式設計軟體完全自主研發

章節涉及

\(\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;
}