牛客網 對稱二叉樹(遞迴)

2021-10-12 08:43:36 字數 2236 閱讀 7878

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

1. 二叉樹;

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

下圖中節點內的數字為權值,節點外的 id 表示節點編號。

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

注意:只有樹根的樹也是對稱二叉樹。本題中約定,以節點 t為子樹根的一棵「子樹」指的是:節點t和它的全部後代節點構成的二叉樹。

本題約定: 層次:節點的層次從根開始定義起,根為第一層,根的孩子為第二層。樹中任一節

點的層次等於其父親節點的層次加 1。 樹的深度:樹中節點的最大層次稱為樹的深度。

滿二叉樹:設二叉樹的深度為 h,且二叉樹有 2h − 1 個節點,這就是滿二叉樹。

完全二叉樹:設二叉樹的深度為 h,除第 h 層外,其它各層的結點數都達到最大

個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。

第一行乙個正整數 ?,表示給定的樹的節點的數目,規定節點編號 1~n,其中節點1 是樹根。

第二行 ? 個正整數,用乙個空格分隔,第 ? 個正整數 ?? 代表節點 ? 的權值。

接下來 ? 行,每行兩個正整數 ? , ? ,分別表示節點 ? 的左右孩子的編號。如果不存在左 / 右孩子,則以 −1 表示。兩個數之間用乙個空格隔開。

輸出檔案共一行,包含乙個整數,表示給定的樹的最大對稱二叉子樹的節點數。
示例1

最大的對稱二叉子樹為以節點 2 為樹根的子樹,節點數為 1。

示例2

10

最大的對稱二叉子樹為以節點 7 為樹根的子樹,節點數為 3。

共 25 個測試點。 ?? ≤ 1000。

測試點 1~3,? ≤ 10,保證根結點的左子樹的所有節點都沒有右孩子,根結點的右 子樹的所有節點都沒有左孩子。

測試點 4~8,? ≤ 10。

測試點 9~12,? ≤ 10^5,保證輸入是一棵「滿二叉樹」。 

測試點 13~16,? ≤ 10^5,保證輸入是一棵「完全二叉樹」。 

測試點 17~20,? ≤ 10^5,保證輸入的樹的點權均為 1。 

測試點 21~25,? ≤ 10^6。

思路:題目描述的賊複雜, 其實就是找到乙個盡可能大的子樹滿足這個子樹是完全對稱的(元素對稱並且結構對稱),因此我們直接遞推判斷就好啦。

#include#includeusing namespace std;

#define maxn 1000005

int n,mx,arr[maxn],node[maxn][2];

bool work(int l,int r)

int main(void)

int ans=1;

for(int i=1;i<=n;i++)

printf("%d\n",ans);

return 0;

}

牛客網 二叉樹

如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹中共有4個...

重建二叉樹(牛客網)

從前序遍歷和中序遍歷重建乙個二叉樹。步驟如下 1 根據前序遍歷的第乙個元素建立根節點 2 在中序遍歷找到這個元素,左邊的元素都是根節點的左子樹的結點,右邊的元素都是右子樹的結點 3 在前序遍歷中找到屬於左右子樹的前序序列 4 左子樹重複123 5 右子樹重複123 6 返回根節點 例如前序遍歷序列和...

牛客刷題二叉樹之對稱二叉樹

請實現乙個函式,用來判斷一棵二叉樹是不是對稱的。注意,如果乙個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。用兩種方式,遞迴和非遞迴 一 遞迴方式 struct treenode class solution bool issymmetricalcore treenode left,treenod...