二叉树判等IsSame Tree python实现
2018-03-22 17:21
323 查看
最近在找工作啊,真的是一言难尽......常常被些屁都不懂的混子给玩了,大老远把你骗过去问些不着调的问题三两句就打发。偶尔遇见靠谱的算你运气了,就算面不上(条件不符合或不是真的想招人),至少是正经的真正在面试,扯谈也至少扯的是技术,交流中也能互相收获,成长。
废话不多说,又遇到二叉树相关的题,题目虽简单,但用到些经典思路,所以记录下:
判断两个二叉树是否相等
class Node():
def __init__(self,val,left=None,right=None):
self.val = val
self.left = left
self.right = right
def IsSame(self, node):
#以上为题干部分, 下面采用先根序遍历(复杂度O(n)=2n)的方法来实现:
p, q = self, node
S0 = [] #栈0
S1 = [] #栈1
while (p and q) or len(S0):
if p and q:
if p.val != q.val:
return False
S0.append(p.right) #存右置左
p = p.left
S1.append(q.right)
q = q.left
p = S0.pop()
q = S1.pop()
if (p and (not q))or((not p)and q): #有一个不为None
return False
return True
其实一开始我也写错了,而且没测,是发出后才知,非常尴尬...错在对象方法中用了递归方法,然后出现回调问题。(NoneType不能通过self调用IsSame方法),这个思路没问题,但须用外函数写才行:
def IsSame(a, b): #外函数递归方法
'''如有空树的情况'''
if (not a)and(not b): #都为None
return True
if (not a) or (not b): #有一个不为None
return False
if a.val != b.val:
return False
return IsSame(a.left, b.left)and IsSame(a.right, b.right)
#以下为测试过程
if __name__ == '__main__':
# 手动创建一课二叉树
tree = Node(1,None,None)
tree.left = Node(2, None, None)
tree.right = Node(3, None, None)
tree.left.left = Node(4, None, None)
tree.left.right = Node(5, None, None)
tree.right.left = Node(6, None, None)
tree.right.right = Node(7, None, None)
tree.left.left.left = Node(8, None, None)
tree.left.left.right = Node(9, None, None)
tree.left.right.left = Node(10, None, None)
tree.left.right.left.right = Node(11, None, None)
print("手动创建一个二叉树tree\n再创建同样一个tree0")
tree0 = Node(1,None,None)
tree0.left = Node(2, None, None)
tree0.right = Node(3, None, None)
tree0.left.left = Node(4, None, None)
tree0.left.right = Node(5, None, None)
tree0.right.left = Node(6, None, None)
tree0.right.right = Node(7, None, None)
tree0.left.left.left = Node(8, None, None)
tree0.left.left.right = Node(9, None, None)
tree0.left.right.left = Node(10, None, None)
tree0.left.right.left.right = Node(11, None, None)
print(tree.IsSame(tree0))
print(IsSame(tree,tree0))
两种方法都可以通过测试。
————欢迎转载,但请注明出处!
废话不多说,又遇到二叉树相关的题,题目虽简单,但用到些经典思路,所以记录下:
判断两个二叉树是否相等
class Node():
def __init__(self,val,left=None,right=None):
self.val = val
self.left = left
self.right = right
def IsSame(self, node):
#以上为题干部分, 下面采用先根序遍历(复杂度O(n)=2n)的方法来实现:
p, q = self, node
S0 = [] #栈0
S1 = [] #栈1
while (p and q) or len(S0):
if p and q:
if p.val != q.val:
return False
S0.append(p.right) #存右置左
p = p.left
S1.append(q.right)
q = q.left
p = S0.pop()
q = S1.pop()
if (p and (not q))or((not p)and q): #有一个不为None
return False
return True
其实一开始我也写错了,而且没测,是发出后才知,非常尴尬...错在对象方法中用了递归方法,然后出现回调问题。(NoneType不能通过self调用IsSame方法),这个思路没问题,但须用外函数写才行:
def IsSame(a, b): #外函数递归方法
'''如有空树的情况'''
if (not a)and(not b): #都为None
return True
if (not a) or (not b): #有一个不为None
return False
if a.val != b.val:
return False
return IsSame(a.left, b.left)and IsSame(a.right, b.right)
#以下为测试过程
if __name__ == '__main__':
# 手动创建一课二叉树
tree = Node(1,None,None)
tree.left = Node(2, None, None)
tree.right = Node(3, None, None)
tree.left.left = Node(4, None, None)
tree.left.right = Node(5, None, None)
tree.right.left = Node(6, None, None)
tree.right.right = Node(7, None, None)
tree.left.left.left = Node(8, None, None)
tree.left.left.right = Node(9, None, None)
tree.left.right.left = Node(10, None, None)
tree.left.right.left.right = Node(11, None, None)
print("手动创建一个二叉树tree\n再创建同样一个tree0")
tree0 = Node(1,None,None)
tree0.left = Node(2, None, None)
tree0.right = Node(3, None, None)
tree0.left.left = Node(4, None, None)
tree0.left.right = Node(5, None, None)
tree0.right.left = Node(6, None, None)
tree0.right.right = Node(7, None, None)
tree0.left.left.left = Node(8, None, None)
tree0.left.left.right = Node(9, None, None)
tree0.left.right.left = Node(10, None, None)
tree0.left.right.left.right = Node(11, None, None)
print(tree.IsSame(tree0))
print(IsSame(tree,tree0))
两种方法都可以通过测试。
————欢迎转载,但请注明出处!
相关文章推荐
- python实现二叉树及其七种遍历方式(递归+非递归)
- Python 实现二叉树相关操作
- 【python中二叉树的实现】python中二叉树的创建、三种方式递归遍历和非递归遍历
- 搜索二叉树(Binary Tree)java实现
- 二叉树的遍历(python实现)
- 用python实现二叉树结构
- Python学习笔记:Trie Tree的实现
- 【LeetCode】 Invert Binary Tree(二叉树反转 递归、非递归实现)
- LeetCode 94 Binary Tree Inorder Traversal(Python详解及实现)
- LeetCode 96 Unique Binary Search Tree(Python详解及实现)
- 数据结构:树tree和二叉树BinaryTree的实现与代码分析
- 前中序重建二叉树python实现
- python实现二叉树的前、中、后序遍历及按层遍历
- The Search Tree的Python实现(二)
- python实现二叉树的建立以及遍历(递归前序、中序、后序遍历,队栈前序、中序、后序、层次遍历)
- 二叉树的实现及四种常用遍历(python)
- leetcode 【 Convert Sorted List to Binary Search Tree 】python 实现
- 数据结构之C++实现二叉树(BinTree)(无主函数)
- python实现二叉树的操作(7种)
- KD-tree的原理以及构建与查询操作的python实现