LeetCode演算法題101 對稱二叉樹解析

2021-08-30 15:51:09 字數 2678 閱讀 9929

給定乙個二叉樹,檢查它是否是映象對稱的。

例如,二叉樹 [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

說明:

如果你可以運用遞迴和迭代兩種方法解決這個問題,會很加分。

既然說用兩種方法會很加分那就都得會啊,(樹結構還是很陌生,**參考了答案)首先是遞迴方法,從根節點來開始考慮,首先根節點一定是相同的,然後左子節點要等於右子節點,然後再往下考慮一步,左子節點的左子節點要等於右子節點的右子節點,而且左子節點的右子節點要等於右子節點的左子節點。然後依次往下推,從一開始就比較的是樹的左側和右側的值。

c++源**:

/**

* definition for a binary tree node.

* struct treenode

* };

*/class

solution

bool

ismirror

(treenode* p, treenode* q)

};

python3源**:

# definition for a binary tree node.

# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class

solution

:def

issymmetric

(self, root)

:"""

:type root: treenode

:rtype: bool

"""return self.ismirror(root, root)

defismirror

(self, p, q)

:if p==

none

and q==

none

:return

true

if p==

none

or q==

none

:return

false

return p.val==q.val and self.ismirror(p.left, q.right)

and self.ismirror(q.left, p.right)

然後說一下迭代,我覺得迭代和遞迴其實差不多,這裡用了佇列來儲存子節點,每次存一對,左子節點的左子節點和右子節點的右子節點或者左子節點的右子節點和右子節點的左子節點。然後迭代比較這兩個點的值。這裡產生了乙個疑惑,遞迴用的是棧的原理,而佇列其實就是個堆,為什麼產生了一樣的效果呢?我覺得應該是這樣,這裡的遞迴其實並沒有用到後面的值,在遞迴的過程中其實隨時可能中斷遞迴,也就是遞迴的目的是為了遍歷整個樹,所以和使用佇列直接遍歷整個樹沒什麼區別。關於迭代方法的思想我覺得其實就是把這個樹都按對裝到了佇列中,然後進行比較,只是**中在放的過程中進行比較並且將比較過後的刪除並給出結果。這個結果是假,那麼直接退出,如果是真,繼續遍歷。

c++源**:

/**

* definition for a binary tree node.

* struct treenode

* };

*/class

solution

return

true;}

};

python3源**:

# definition for a binary tree node.

# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class

solution

:def

issymmetric

(self, root)

:"""

:type root: treenode

:rtype: bool

"""q =

[root]

while

len(q)!=0

: a = q.pop(0)

b = q.pop(0)

if a==

none

and b==

none

:continue

if a==

none

or b==

none

:return

false

if a.val != b.val:

return

false

return

true

LeetCode初級演算法之樹 101 對稱二叉樹

題目資訊 給定乙個二叉樹,檢查它是否是映象對稱的。示例1 是對稱的 1 2 2 3 4 4 3 示例2 不對稱 1 2 2 3 3 解法一 遞迴 我們先來劃分子問題,乙個樹對稱也就最終根節點的左子樹與右子樹是對稱的映象的,那麼要求左子節點與右子節點相等的同時左節點的左子樹 右子樹 與右節點的右子樹 ...

leetcode演算法題 最長數對鏈

1 動態規劃 dp i 表示第i個位置最長的數對鏈的長度狀態轉移 dp i max dp j 1 j從0到i不過題目的數對是可以亂序的,所以我們先提前給按數對第乙個數來從小到大排序,然後再進行動態規劃。其實根據第二種貪心演算法,按第二個數來排序更好!static bool lessvector co...

LeetCode 劍指offer刷題10 1

leetcode 劍指offer刷題 劍指 offer 10 i.斐波那契數列 寫乙個函式,輸入 n 求斐波那契 fibonacci 數列的第 n 項。斐波那契數列的定義如下 f 0 0,f 1 1 f n f n 1 f n 2 其中 n 1.斐波那契數列由 0 和 1 開始,之後的斐波那契數就是...