Problem Definition:
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree is symmetric:
1 / \ 2 2 / \ / \ 3 4 4 3
But the following is not:
1 / \ 2 2 \ \ 3 3
Note:
Bonus points if you could solve it both recursively and iteratively.
Solution:
从根节点A开始,检查左右子节点的对称性:
1._如果俩子节点都是空的,则树数对称的,返回True;
2._如果有且仅有一个子节点是空的,则树不对称,返回False;
3._如果俩子节点都不空,则先检查子节点包含的值是否相等,若不相等,则树不对称,False。若相等,则继续往下检查。
关键是接下来检查哪些节点:a._B1向左到C1、B2向右到C2,对C1、C2这俩节点重复以上步骤。b._B1向右到D1、B2向左到D2,对D1、D2重复以上步骤。
a._和b._两个结果相与,返回。
基于以上的递归描述,可以得到递归的解法:
1 def isSymmetric(root): 2 return root==None or sym(root.left,root.right) 3 def sym(self,p,q): 4 if p==None or q==None: 5 return p==q 6 if p.val!=q.val: 7 return False 8 return sym(p.left,q.right) and sym(p.right,q.left)
也可以借助栈来把递归改成循环的形式:
1 def isSymmetric(root): 2 if root==None: 3 return True 4 sta=[] 5 if root.left!=None: 6 if root.right==None: 7 return False 8 sta+=[root.left,root.right] 9 elif root.right!=None: 10 return False 11 12 while sta: #not empty 13 R=sta.pop() 14 L=sta.pop() 15 if R.val!=L.val: 16 return False 17 18 if L.left!=None: 19 if R.right==None: 20 return False 21 sta+=[L.left,R.right] 22 elif R.right!=None: 23 return False 24 25 if L.right!=None: 26 if R.left==None: 27 return False 28 sta+=[L.right,R.left] 29 elif R.left!=None: 30 return False 31 return True
注意:不能用两种不同顺序(如“左中右”和“右中左”)遍历得到相同的值序列来确定树是否对称。
就像不能用这两种顺序来确定一棵树。(要确定一棵树,至少要已知两种遍历序列,且其中一种是中序。)