題目描述
一棵有點權的有根樹如果滿足以下條件,則被軒軒稱為對稱二叉樹:
二叉樹;
將這棵樹所有節點的左右子樹交換,新樹和原樹對應位置的結構相同且點權相等。
現在給出一棵二叉樹,希望你找出它的一棵子樹,該子樹為對稱二叉樹,且節點數 最多。請輸出這棵子樹的節點數。
注意:只有樹根的樹也是對稱二叉樹。本題中約定,以節點 t 為子樹根的一棵「子 樹」指的是:節點t 和它的全部後代節點構成的二叉樹。
輸入格式
第一行乙個正整數 n,表示給定的樹的節點的數目,規定節點編號 1∼n,其中節點 1 是樹根。
第二行 n 個正整數,用乙個空格分隔,第 i 個正整數 vi 代表節點 i 的權值。
接下來 n 行,每行兩個正整數 li,ri,分別表示節點 i 的左右孩子的編號。如果不存在左 / 右孩子,則以 -1 -1 表示。兩個數之間用乙個空格隔開。
輸出格式
輸出檔案共一行,包含乙個整數,表示給定的樹的最大對稱二叉子樹的節點數。
找出所有子樹,判斷其是否對稱(一顆樹是否對稱取決於它的所有子樹都對稱),找出最大的對稱子樹;
遞迴遍歷樹是顯然的,剛開始想的是每顆樹的左右子樹權值能組成的字串都算出來,然後判斷左右子樹的字串是否相同,但是又tle又wa;
正解是對於每個子樹的根結點,其左右子樹的結點假設為 l,r,那麼應該滿足
w[ l[l] ]=w[ r[r] ]&&w[ r[l] ]=w[ l[r] ] ;
#include
#define ll long long
#define pa pair
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using
namespace std;
const
int n=
1000010
;const
int m=
1000100
;const
int mod=
1e5+7;
int n,w[n]
,l[n]
,r[n]
,size[n]
,ans;
intdfs
(int fa)
bool
judge
(int l,
int r)
intmain()
} cout
}
洛谷P2015 蘋果二叉樹(樹形dp)
給出乙個n個點的二叉樹,樹上有邊權,求留下q個樹枝能夠獲得的最大收益為多少。dp i j d p i j 表示在以 i i 為根的節點,留下 j role presentation j j個分支,的最大收益值。設u u 為當前遍歷到的根節點,v role presentation v v為訪問的子節...
洛谷 新二叉樹(P1305,二叉樹)
輸入一串二叉樹,輸出其前序遍歷。輸入格式 第一行為二叉樹的節點數 n。1 n 26 後面 n 行,每乙個字母為節點,後兩個字母分別為其左右兒子。空節點用 表示 輸出格式 二叉樹的前序遍歷。輸入輸出樣例輸入6 abcbdi cj d i j 輸出abdicj include using namespa...
洛谷P1040 加分二叉樹(樹形dp)
時間限制 1 sec 記憶體限制 125 mb 提交 11 解決 7 設乙個n個節點的二叉樹tree的中序遍歷為 l,2,3,n 其中數字1,2,3,n為節點編號。每個節點都有乙個分數 均為正整數 記第j個節點的分數為di,tree及它的每個子樹都有乙個加分,任一棵子樹subtree 也包含tree...