題解 對稱二叉樹

2021-10-23 19:59:01 字數 3350 閱讀 5994

給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是「同構」的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a、b、g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。

一般情況(樹hash):

遞迴判斷(用於二叉樹):

其實就是多考慮了一下節點的順序問題而已。

法一.

列舉根節點,遞迴判斷是否對稱。o(n

logn

)o(nlogn)

o(nlog

n),n是列舉,logn是check函式。

#include

using

namespace std;

const

int n =

1e6+5;

int n, cost[n]

, l[n]

, r[n]

, con[n]

, root, ans;

bool vis[n]

;void

dfs(

int x)

bool

check

(int x,

int y)

intmain()

for(

int i =

1; i <= n; i++)if

(!vis[i]

)dfs

(root)

;for

(int i =

1; i <= n; i++)if

(check

(l[i]

, r[i]))

ans =

max(ans, con[i]);

printf

("%d"

, ans)

;}

法二.顯然可以直接hash樹的形態,即分中序遍歷1(先進左子樹)和中序遍歷2(先進右子樹)記錄hash值,對於每乙個節點,若是此節點的左兒子的中序遍歷1的hash值等於右兒子的中續遍歷2的hash值,說明這個點為根的樹是對稱的。

由於要考慮順序,所以這裡直接乘係數,不平方。

h as

h[x]

=has

h[l[

x]]∗

v1+c

ost[

x]∗v

2+ha

sh[r

[x]]

∗v3;

hash[x]=hash[l[x]]*v1+cost[x]*v2+hash[r[x]]*v3;

hash[x

]=ha

sh[l

[x]]

∗v1+

cost

[x]∗

v2+h

ash[

r[x]

]∗v3;ha

sh[x

]=ha

sh[r

[x]]

∗v1+

cost

[x]∗

v2+h

ash[

l[x]

]∗v3

;hash[x]=hash[r[x]]*v1+cost[x]*v2+hash[l[x]]*v3;

hash[x

]=ha

sh[r

[x]]

∗v1+

cost

[x]∗

v2+h

ash[

l[x]

]∗v3

;實測88pts,運氣好的話,像下面這個**,可以ac。這個方法不建議用。

其實我也沒打出來

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define llg long long

#define maxn 1000100

#define v1 (llg)(999999751)

#define v2 (llg)(299999827)

#define v3 (llg)(100000007)

#define md (llg)(89999794200117649)

#define mdd (llg)(999999786000011449)

#define yyj(a) freopen(a ".in", "r", stdin), freopen(a ".out", "w", stdout);

inline llg getint()

unsigned

long

long hal[maxn]

, har[maxn]

, har[maxn]

, hal[maxn]

;llg val[maxn]

, n, ans, he[maxn]

, lson[maxn]

, rson[maxn]

;void

dfs(llg x, llg fa)

hal[x]

= hal[lson[x]

]* v1 + val[x]

* v2 + hal[rson[x]

]* v3;

hal[x]

= hal[lson[x]

]* v1 + val[x]

* v2 + hal[rson[x]

]* v3;

hal[x]

%= md;

hal[x]

%= mdd;

har[x]

= har[rson[x]

]* v1 + val[x]

* v2 + har[lson[x]

]* v3;

har[x]

= har[rson[x]

]* v1 + val[x]

* v2 + har[lson[x]

]* v3;

har[x]

%= md;

har[x]

%= mdd;

}int

main()

dfs(1,

-1);

cout << ans;

return0;

}

對稱二叉樹題解

請實現乙個函式,用來判斷一棵二叉樹是不是對稱的。如果一棵二叉樹和它的映象一樣,那麼它是對稱的。例如,二叉樹 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,...

對稱二叉樹c 對稱的二叉樹

很簡單,關鍵還是知道怎麼樣才能判斷乙個 二叉樹是否對稱,只要採用前序 中序 後序 層次遍歷等任何一種遍歷方法,分為先左後右和先 右後左兩種方法,只要兩次結果相等就說明這棵樹是一顆對稱二叉樹。迭代版本 class solution public bool issymmetric treenode ro...

力扣題解 對稱二叉樹

題目 給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。但是 1,2,2,null,3,null,3 則不是映象對稱的 public class solution treenode left root.left treenode right root.rig...