每日一題 7月6日精講 平衡二叉樹

2021-10-07 22:22:48 字數 1550 閱讀 7490

時間限制:c/c++

1秒,其他語言2秒

空間限制:c/c++

1048576k,其他語言2097152k

64bit io format:

%lld

平衡二叉樹,顧名思義就是一棵「平衡」的二叉樹。在這道題中,「平衡」的定義為,對於樹中任意乙個節點,都滿足左右子樹的高度差不超過 d.

空樹的高度定義為0,單個節點的高度為1,其他情況下樹的高度定義為根節點左右子樹高度最大值 + 1.

一棵在高度上平衡的樹,節點數可能不平衡,因此再定義一棵樹的不平衡度為這棵樹中所有節點的左右子樹的節點數之差的最大值。 給定平衡的定義引數d,

你需要求出所有高度為 n 的平衡樹中不平衡度的最大值。

輸入描述:

兩個整數,n, d.

輸出描述:

乙個整數:所有高度為 n 的平衡樹中不平衡度的最大值。

示例1

輸入

4

1

輸出

5
說明

下面這棵樹在 d=1 的定義下高度是平衡的,其不平衡度為 5。

備註:

0 ≤ n, d ≤ 60

不平衡度為這棵樹中所有節點的左右子樹的節點數之差的最大值

那我們要讓不平衡度最大就要盡可能使左右子樹差最大,左子樹盡可能多,右子樹盡可能少

左子樹盡可能多的話我們可以直接給拉滿,也就是滿二叉樹節點就是pow(2,n-1),n為整個樹的高度,n-1為左子樹的高度

右子樹盡可能少,那深度就盡可能淺,但因為有題目左右子樹的高度差不超過 d的限制,所以右子樹的深度就是m=n-1-d。然後右子樹也是有左右子子樹,同樣的道理

我們定義dp[i]表示深度為i的子樹最少總節點個數

當前的樹高是i,滿足題意就是建一顆高度為i-1的左子樹和一顆h-d-1的右子樹

能得到轉移方程:dp[i]=dp[i-1]+dp[i-d-1]+1

這個+1就是+根

我們要求最大的不平衡度

最後用滿左子樹 -(高度為n-d-1的右子樹)- 1

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

1e3+4;

ll dp[maxn]

;int

main()

cout<

-1<

return0;

}

每日一題 7月6日精講 平衡二叉樹

時間限制 c c 1秒,其他語言2秒 空間限制 c c 1048576k,其他語言2097152k 64bit io format lld 平衡二叉樹,顧名思義就是一棵 平衡 的二叉樹。在這道題中,平衡 的定義為,對於樹中任意乙個節點,都滿足左右子樹的高度差不超過 d.空樹的高度定義為0,單個節點的...

每日一題 4月7日題目精講 樹

樹 時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k 其他語言262144k 64bit io format lld 題目描述 shy有一顆樹,樹有n個結點。有k種不同顏色的染料給樹染色。乙個染色方案是合法的,當且僅當對於所有相同顏色的點對 x,y x到y的路徑上的所有點的顏色...

每日一題 平衡二叉樹

題目描述 給定乙個二叉樹,判斷它是否是高度平衡的二叉樹。本題中,一棵高度平衡二叉樹定義為 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1 示例1 輸入 root 3,9,20,null,null,15,7 輸出 true 示例2 輸入 root 1,2,2,3,3,null,null,...