給定乙個二叉樹,檢查它是否是映象對稱的。
例如,二叉樹 [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.怎麼判斷一棵樹是不是對稱二叉樹? 答案:如果所給根節點,為空,那麼是對稱。如果不為空的話,當他的左子樹與右子樹對稱時,他對稱
2.那麼怎麼知道左子樹與右子樹對不對稱呢?在這我直接叫為左樹和右樹 答案:如果左樹的左孩子與右樹的右孩子對稱,左樹的右孩子與右樹的左孩子對稱,那麼這個左樹和右樹就對稱。
仔細讀這句話,是不是有點繞?怎麼感覺有乙個功能a我想實現,但我去實現a的時候又要用到a實現後的功能呢?
當你思考到這裡的時候,遞迴點已經出現了: 遞迴點:我在嘗試判斷左樹與右樹對稱的條件時,發現其跟兩樹的孩子的對稱情況有關係。
想到這裡,你不必有太多疑問,上手去按思路寫**,函式a(左樹,右樹)功能是返回是否對稱
def 函式a(左樹,右樹): 左樹節點值等於右樹節點值 且 函式a(左樹的左子樹,右樹的右子樹),函式a(左樹的右子樹,右樹的左子樹)均為真 才返回真
實現完畢。。。
寫著寫著。。。你就發現你寫出來了。。。。。。
# 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: treenode) -> bool:
def ismirror(node1,node2):
if not node1 and not node2:
return true
elif not node1 or not node2: #在上乙個判斷後繼續判斷是否有乙個為空,避免node.val報錯。
return false
if node1.val != node2.val:
return false
return ismirror(node1.left,node2.right) and ismirror(node1.right,node2.left)
return ismirror(root,root)
對稱二叉樹c 對稱的二叉樹
很簡單,關鍵還是知道怎麼樣才能判斷乙個 二叉樹是否對稱,只要採用前序 中序 後序 層次遍歷等任何一種遍歷方法,分為先左後右和先 右後左兩種方法,只要兩次結果相等就說明這棵樹是一顆對稱二叉樹。迭代版本 class solution public bool issymmetric treenode ro...
對稱二叉樹
請實現乙個函式,用來判斷一顆二叉樹是不是對稱的。注意,如果乙個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。這題還是蠻簡單的。對稱二叉樹 include using namespace std struct treenode bool issymmetrical treenode proot1,t...
對稱二叉樹
請實現乙個函式,用來判斷一顆二叉樹是不是對稱的。注意,如果乙個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。solution public class treenode 我們可以通過比較二叉樹的前序遍歷序列和對稱前序遍歷序列來判斷二叉樹是不是對稱的 public class solution bo...