對稱二叉樹 NOIP2018

2021-10-03 02:34:47 字數 1758 閱讀 3581

首先,我們將題目給定的對稱二叉樹的定義來梳理一遍:

一棵有點權的有根樹如果滿足以下條件

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 對稱二叉樹

在考場上的玄學思路 這道題的思路相對來說還是很好想出來的 首先,對於每乙個節點,只要右兒子節點與左兒子節點的權值不同,就肯定不是對稱的,捨去 然後,每一次向下走一層的時候,左子樹跟右子樹的路徑取反 什麼意思呢?就是,你左子樹向右走,右子樹就向左走 左子樹向左走,右子樹向右走 如果這裡不能理解建議動手...