方法二-迭代(佇列)
通過同步移動兩個指標的方法來遍歷這棵樹,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...