题目
树的子结构
一、思路
在树中寻找子树,从直观思维的角度来看,应该是先寻找相同的根节点,如果有相同的根节点,再去比较下面的结构。
因此可以分两个部分:
1.树中是否有相同的根节点R
2.R对应的结构与子树是否相同
class Binary_Tree():
def __init__(self, var=None, left=None, right=None):
self.var = var
self.left = left
self.right = right
一、树中是否有相同的根节点R
从根节点开始递归比较
def is_same_root(treeA, treeB):
if not treeA or not treeB:
return False
if treeA.var == treeB.var:
res = is_sub_tree(treeA, treeB)
# 当前根节点对比后没有找到子结构,寻找当前左节点是否含有子结构
if not res and treeA.left:
res = is_sub_tree(treeA.left, treeB)
# 当前根节点左节点对比后没有都找到子结构,寻找当前右节点是否含有子结构
if not res and treeA.right:
res = is_sub_tree(treeA.right, treeB)
return res
二.R对应的结构与子树是否相同
def is_sub_tree(treeA, treeB):
# 如果当前的子树已经没有结构了,返回相同
if not treeB:
return True
# 如果当前的树已经没有结构了,子树还有,返回没有相同结构
if not treeA:
return False
if treeA.var == treeB.var:
return is_sub_tree(treeA.left, treeB.left) and is_sub_tree(treeA.right, treeB.right)
if __name__ == '__main__':
root = Binary_Tree(root=8)
root_left = Binary_Tree(root=8)
root.left = root_left
root_right = Binary_Tree(root=7)
root.right = root_right
root_left_left = Binary_Tree(root=9)
root_left_right = Binary_Tree(root=2)
root_left.left = root_left_left
root_left.right = root_left_right
root_left_right_left = Binary_Tree(root=4)
root_left_right_right = Binary_Tree(root=7)
root_left_right.left = root_left_right_left
root_left_right.right = root_left_right_right
sub_root = Binary_Tree(root=8)
sub_left = Binary_Tree(root=9)
sub_right = Binary_Tree(root=2)
sub_root.left = sub_left
sub_root.right = sub_right
r1 = is_same_root(root, sub_root)
print(r1)