JZ 28 對稱的二叉樹(遞迴 佇列)

2021-10-21 17:32:24 字數 2328 閱讀 5496

方法二-迭代(佇列)

通過同步移動兩個指標的方法來遍歷這棵樹,p和q一開始都指向這棵樹的根,隨後p左移時q右移,p右移時q左移,每移動一次都要檢查當前兩個指標所指的結點的值是否相等,相等再繼續往下遍歷。

設 i ss

ymme

tric

(roo

t)issymmetric(root)

issymm

etri

c(ro

ot) 用來判斷以 roo

troot

root

為根節點的樹是否對稱:

設 c he

ck(l

,r)check(l,\ r)

check(

l,r)

用來判斷分別以 l

ll、r

rr 為根節點的樹是否對稱:

遞推過程:

判斷 l.l

eftl.left

l.left

與 r.ri

ghtr.right

r.righ

t 是否對稱,即 che

ck(l

.lef

t,r.

righ

t)check(l.left,\ r.right)

check(

l.le

ft,r

.rig

ht);

判斷 l.r

ight

l.right

l.righ

t 與 r.l

eftr.left

r.left

是否對稱,即 che

ck(l

.rig

ht,r

.lef

t)check(l.right,\ r.left)

check(

l.ri

ght,

r.le

ft);

終止條件:

兩樹同時越過葉節點,返回 tru

etrue

true

;兩樹中只有乙個越過葉節點,返回 fal

sefalse

false;

對應節點值不相等,返回 fal

sefalse

false。

返回值:che

ck(l

.lef

t,r.

righ

t)&⁣

&che

ck(l

.rig

ht,r

.lef

t)check(l.left,\ r.right)\ \and\!\and\ check(l.right,\ r.left)

check(

l.le

ft,r

.rig

ht)&

&che

ck(l

.rig

ht,r

.lef

t)

/**

* definition for a binary tree node.

* public class treenode

* }*/class

solution

private

boolean

check

(treenode l, treenode r)

}

引入佇列,初始時將根結點入隊兩次,每次提取兩個結點並比較它們的值(佇列中每兩個連續的結點應該是相等的,並且它們的子樹互為映象),然後將兩個結點的左右子結點按相反的順序插入佇列中,當隊列為空或檢測到不對稱(即從佇列中取出的兩個連續結點不相等)時演算法結束。

注意:

這個迭代法,其實是把左右兩個子樹要比較的元素順序放進乙個容器,然後成對取出來進行比較,那麼使用棧也是可以的。

class

solution

private

boolean

check

(treenode u, treenode v)

return

true;}

}

28 對稱的二叉樹

請實現乙個函式,用來判斷一棵二叉樹是不是對稱的。如果一棵二叉樹和它的映象一樣,那麼它是對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。示例 1 輸入 root 1,2,2,3,4,4,3 輸出 true 示例 2 輸入 root 1,2,2,null,3,null,3 輸出 false ...

27 二叉樹映象28 對稱二叉樹

解題思路 這裡還是貼下大佬的解答。遞迴這方面我做的不夠好,看週末能不能整理個遞迴的合集。在這裡插入 片 class solution def issymmetric self,root treenode bool def recur l,r if not l and not r return tru...

JZ58 對稱的二叉樹

請實現乙個函式,用來判斷一棵二叉樹是不是對稱的。注意,如果乙個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。嘗試解法 1.計算出映象二叉樹 參考jz18 2.比較兩棵樹 如下圖jz56可以遍歷phead。故改變方法 1.拷貝二叉樹 2.映象二叉樹 3.比較映象二叉樹與原二叉樹是否一摸一樣 stru...