首先,我們將題目給定的對稱二叉樹的定義來梳理一遍:
一棵有點權的有根樹如果滿足以下條件
1.這是一棵二叉樹
2.將這棵樹所有節點的左右子樹交換,新樹和原樹對應位置的結構相同且點權相等。
則這顆樹就是一棵對稱二叉樹
我們來看9~12的資料:
這是一棵滿二叉樹
所以,對於這一檔資料,我們只要判斷他們的權值是否相等就行了
再看17~20的資料:
這是一顆所有權值都為1的二叉樹
對於這一檔資料,我們需要判斷它的結構是否正確
對於全部的資料,我們即需要判斷結構,還要判斷權值,
怎麼辦呢
我們可以用到dfs**!!!
接下來思路就很清晰了:
若這棵樹是對稱二叉樹
1.他的兩個子樹高度相同
2.他的兩個子樹節點數相同
3.他的兩個子樹的權值和,max,min都相同
這裡就可以用乙個check函式來判斷了
接下來附上完整**:
#include
using
namespace std;
int n;
long
long ans=1;
long
long h,size;
long
long a[
1000005];
long
long l[
1000005];
long
long r[
1000005];
bool
check
(long
long x,
long
long y)
void
dfs(
long
long root,
long
long
&h,long
long
&size)
long
long hl,hr,sizel,sizer;
dfs(l[root]
,hl,sizel)
;dfs
(r[root]
,hr,sizer);if
(hl==hr&&sizel==sizer)if(
check
(l[root]
,r[root])==
true
) ans=
max(ans,sizel+sizer+1)
; h=
max(hl,hr)+1
; size=sizel+sizer+1;
}int
main()
a[0]=
-1;dfs(1
,h,size)
;printf
("%lld"
,ans)
;return0;
}
ac( 真的沒加氧氣( o2 ) ! )
以下是測試結果:
NOIP2018普及組 對稱二叉樹
就是一道 純爆搜 並且 非常簡潔 不知道為什麼放在第四題 被擺渡車卡了半天的我qaq 先跑一遍dfs預處理出所有子樹的大小sum 從1到n,以每乙個節點為跟節點向下搜尋,判斷是否是對稱二叉樹,不斷更新滿足條件的最大sum值 設當前節點為x,l x r x 分別代表當前節點的左右子節點 dfs l x...
題解 NOIP2018PJ 對稱二叉樹
在考場上的玄學思路 首先不斷摸索用手划水,用腳蹬水的動作,經過一段時間的練習,你就學會了游泳 這道題的思路相對來說還是很好想出來的 首先,對於每乙個節點,只要右兒子節點與左兒子節點的權值不同,就肯定不是對稱的,捨去 然後,每一次向下走一層的時候,左子樹跟右子樹的路徑取反 什麼意思呢?就是,你左子樹向...
題解 NOIP2018PJ 對稱二叉樹
在考場上的玄學思路 這道題的思路相對來說還是很好想出來的 首先,對於每乙個節點,只要右兒子節點與左兒子節點的權值不同,就肯定不是對稱的,捨去 然後,每一次向下走一層的時候,左子樹跟右子樹的路徑取反 什麼意思呢?就是,你左子樹向右走,右子樹就向左走 左子樹向左走,右子樹向右走 如果這裡不能理解建議動手...