1.方法1
看到這道題我的想法是如果兩棵樹對稱,那麼他們的前序遍歷、後序遍歷和中序遍歷之間應該有關係,所以我嘗試著寫了一棵樹的前序中序和後序遍歷。
就比如這棵樹的前序遍歷是8,6
,5,7
,6,7
,58, 6, 5, 7, 6, 7, 5
8,6,5,
7,6,
7,5,後序遍歷是5,7
,6,7
,5,6
,85, 7, 6, 7, 5, 6, 8
5,7,6,
7,5,
6,8。又嘗試著寫了其他樹的前序和後序遍歷,發現如果一棵樹是對稱的,那麼這棵樹的前序遍歷和後序遍歷是相反的。也就是如果一棵樹的前序遍歷的逆序就是其後序遍歷,那麼這棵樹就是對稱的二叉樹。
然而此處需要注意空節點的情況,比如:
這棵樹的所有遍歷都是777777,然而其並不是對稱的,所以要針對空節點進行特殊處理。在本**中,如果某個節點的左節點為空,那麼就將此位置的值記為#,若右節點為空,那麼就將此位置的值也記為#。此時,上面這棵樹的前序遍歷就變成了777##7##77###,後序遍歷為##7##77##7#77,二者就不是互相的逆序了,問題就解決了。
# -*- coding:utf-8 -*-
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class
solution
:def
preorder
(self, proot)
: pre =
pre +=
[proot.val]
if proot.left is
notnone
: pre += self.preorder(proot.left)
else
: pre +=
['#'
]if proot.right is
notnone
: pre += self.preorder(proot.right)
else
: pre +=
['#'
]return pre
defpostorder
(self, proot)
: post =
if proot.left is
notnone
: post += self.postorder(proot.left)
else
: post +=
['#'
]if proot.right is
notnone
: post += self.postorder(proot.right)
else
: post +=
['#'
] post +=
[proot.val]
return post
defissymmetrical
(self, proot)
:# write code here
if proot is
none
:return
true
post = self.postorder(proot)
pre = self.preorder(proot)
if post[::
-1]== pre:
return
true
else
:return
false
在看了劍指offer的官方解法之後,發現並不需要將後序遍歷和前序遍歷具體的求出來。前序遍歷是根左右的順序,如果這棵樹對稱,那麼這棵樹按照根右左的順序遍歷出的序列應該與前序遍歷的序列相同。
# -*- coding:utf-8 -*-
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class
solution
:def
issym
(self, proot1, proot2)
:if proot1 is
none
and proot2 is
none
:return
true
if proot1 is
none
or proot2 is
none
:return
false
if proot1.val != proot2.val:
return
false
return self.issym(proot1.left, proot2.right)
and self.issym(proot1.right, proot2.left)
defissymmetrical
(self, proot)
:# write code here
return self.issym(proot, proot)
劍指Offer 二叉樹 對稱的二叉樹
含有兩道題,都從樹的遞迴入手 請完成乙個函式,輸入乙個二叉樹,該函式輸出它的映象。解題思路 映象翻 只需要遍歷二叉樹,每次訪問乙個結點時,交換其左右子樹。實現 definition for a binary tree node.class treenode def init self,x self....
劍指offer 對稱的二叉樹
請實現乙個函式,用來判斷一顆二叉樹是不是對稱的。注意,如果乙個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。思路 複製一顆二叉樹,在該二叉樹的基礎上求得二叉樹的映象,同時遍歷兩顆二叉樹,判斷每乙個節點是否相同。public class solution private treenode copy ...
劍指offer 對稱的二叉樹
請實現乙個函式,用來判斷一顆二叉樹是不是對稱的。注意,如果乙個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。遞迴 coding utf 8 class treenode def init self,x self.val x self.left none self.right none class ...