對稱二叉樹一棵有點權的有根樹如果滿足以下條件,則被軒軒稱為對稱二叉樹:
二叉樹;
將這棵樹所有節點的左右子樹交換,新樹和原樹對應位置的結構相同且點權相等。
下圖中節點內的數字為權值,節點外的 id 表示節點編號。
現在給出一棵二叉樹,希望你找出它的一棵子樹,該子樹為對稱二叉樹,且節點數 最多。請輸出這棵子樹的節點數。
注意:只有樹根的樹也是對稱二叉樹。本題中約定,以節點 t* 為子樹根的一棵「子 樹」指的是:節點tt 和它的全部後代節點構成的二叉樹。
第一行乙個正整數 n,表示給定的樹的節點的數目,規定節點編號 1∼n,其中節點 1 是樹根。
第二行 n 個正整數,用乙個空格分隔,第 ii 個正整數 v_iv**i 代表節點 ii 的權值。
接下來 n行,每行兩個正整數 l_i, r_i,分別表示節點 i* 的左右孩子的編號。如果不存在左 / 右孩子,則以 −1 表示。兩個數之間用乙個空格隔開。
輸出檔案共一行,包含乙個整數,表示給定的樹的最大對稱二叉子樹的節點數。
輸入 #1複製
2
1 3
2 -1
-1 -1
輸出 #1複製
1
分析:
首先分析對稱二叉樹的性質,左子樹權值等於右子樹權值,左子樹結點樹等於右子樹結點樹。遞迴判斷左子樹的左兒子和右子樹的右兒子是否滿足性質。
(早睡早起,改天補題解)
ac code:
#include #include using namespace std;
const int n = 1e6 + 10;
int n;
int w[n], l[n], r[n], size[n];
int calsize(int t)
bool check(int u, int v)
int dfs(int t)
int main()
calsize(1);
printf("%d\n", dfs(1));
return 0;
}
NOIP2018普及組 對稱二叉樹
就是一道 純爆搜 並且 非常簡潔 不知道為什麼放在第四題 被擺渡車卡了半天的我qaq 先跑一遍dfs預處理出所有子樹的大小sum 從1到n,以每乙個節點為跟節點向下搜尋,判斷是否是對稱二叉樹,不斷更新滿足條件的最大sum值 設當前節點為x,l x r x 分別代表當前節點的左右子節點 dfs l x...
對稱二叉樹題解
請實現乙個函式,用來判斷一棵二叉樹是不是對稱的。如果一棵二叉樹和它的映象一樣,那麼它是對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3 但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3 示例 1 輸入 root 1,2,...
題解 對稱二叉樹
給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是 同構 的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a b g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。一般情況 樹hash 遞迴判斷 用於二叉樹 其實就是多考慮了一下節點的順序問題而...