我的天。。普及組這麼$hard$。。。
然後好像沒有人用我的垃圾做法,,,好像是$o(n)$,但十分的慢,並且極其暴力$qwq$
具體來說,就是直接$dfs$求出樹高,然後想像出把原來的樹補成滿二叉樹的形態
震不震驚$qwq$
然後對子樹雜湊,同時儲存正向的雜湊值$h1[u]$和反向的雜湊值$h2[u]$(對稱時用)。
但每次向上合併時要乘的是$base^$,其中$sz=$子樹所形成的完全二叉樹的大小。
這樣雜湊值既可以表示點位置(不同的位置點在完全二叉樹中的位置不同),又可以表示點的數值。
如果還不懂可以康康**
#include#include2019.07.08/09#include
#include
#define r register int
using
namespace
std;
#define ull unsigned long long
#define ll long long
#define pause (for(r i=1;i<=10000000000;++i))
#define in freopen("noipak++.in","r",stdin)
#define out freopen("out.out","w",stdout)
namespace
fread inline
bool isempty(const
char& ch)
inline
void gs(char*s)
}using fread::g; using
fread::gs;
const
int n=1000010,b=2333
;int ch[n][2
];#define ls ch[u][0]
#define rs ch[u][1]
intn,w[n],sz[n],d[n],ans,mxd;
ull h1[n],h2[n],p[n],tmp;
inline
void dfs1(int u)
inline
void dfs(int u)
signed main()
luogu P5018 對稱二叉樹
帶權的二叉樹裡找一棵節點數最多的子樹使得權值和結構都對稱 1e6這題最主要的點還是計算時間複雜度 剛看到的時候總是覺得每個點都要再往下找 那麼這個複雜度顯然是n方的 但是實際上是 n n 2 n 2 n 4 n 4 1 複雜度是嚴格的nlogn 另外就是對樹的遞迴的處理 我總是想在乙個遞迴裡做完所有...
P5018 對稱二叉樹
題解 什麼是對稱二叉樹,簡潔一點就是 任意一棵對稱二叉樹,以根節點為軸,是軸對稱的 qwq我真的只能解釋道這樣了 這道題可以用dfs求解 dfs深搜,size x 記錄以 x 為根的樹的大小 也就是以 x 為根的樹的所有節點的總數 當前節點左兒子非空,繼續遞迴左兒子,右兒子非空,繼續遞迴右兒子 si...
101 對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 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說明 如果你可以運用遞迴和迭代兩種方法解決這個問題,會很加分。思路 遞迴就用dfs,迭代是b...