樹形結構 思維 對稱二叉樹(洛谷 P5018)

2021-10-04 10:07:04 字數 1306 閱讀 7433

題目描述

一棵有點權的有根樹如果滿足以下條件,則被軒軒稱為對稱二叉樹:

二叉樹;

將這棵樹所有節點的左右子樹交換,新樹和原樹對應位置的結構相同且點權相等。

現在給出一棵二叉樹,希望你找出它的一棵子樹,該子樹為對稱二叉樹,且節點數 最多。請輸出這棵子樹的節點數。

注意:只有樹根的樹也是對稱二叉樹。本題中約定,以節點 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...