树的子结构( python实现)
一、题目描述
题目:树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。
二、解题思路
暂略。(此处主要作为书中python实现补充)
三、代码实现
这里,首先用 python 定义一个二叉树节点类,如下。
class BinaryTreeNode(object):
def __init__(self, value = None, left = None, right = None):
self.value = value
self.left = left
self.right = right
这里开始本博客的最重要的部分。第一步定义一个函数,找到 A 树中,与B树根节点相同的节点;第二步判断该节点以下的结构是否存在与树 B 一致的结构。(若面试官没有特殊的要求,可以采用递归实现,代码更简洁,思路更清晰)
首先定义一个判断Tree1中是否包含Tree2的函数,如下。
def theTree1HasTree2(pRoot1,pRoot2):
if pRoot2 is None:
return True
if pRoot1 is None:
return False
if pRoot1.value != pRoot2.value:
return False
return theTree1HasTree2(pRoot1.left, pRoot2.left) and theTree1HasTree2(pRoot1.right,pRoot2.right)
寻找 A 树中,与B树根节点相同的节点;然后利用上面定义好的 theTree1HasTree2() 判断是否满足包含关系。
def hasSubTree(pRoot1,pRoot2):
result = False
# 这里用if判断pRoot2是否为1个空节点,如果是,返回True
if pRoot2.value is None and pRoot2.left is None and pRoot2.right is None:
return True
if pRoot1.value == pRoot2.value:
result = theTree1HasTree2(pRoot1, pRoot2)
if result is not True:
result = theTree1HasTree2(pRoot1.left, pRoot2)
if result is not True:
result = theTree1HasTree2(pRoot1.right, pRoot2)
return result
以下采用比较直观的方式,对上述函数进行测试。首先,暴力生成一棵二叉树,这里只是为了测试,二叉树的相关定义及操作实现可参考:link(待添加)。
暴力创建第一棵二叉树(Tree1),如下。
Tree1 = BinaryTreeNode(1)
Tree1.left = BinaryTreeNode(2)
Tree1.right = BinaryTreeNode(3)
Tree1.left.left = BinaryTreeNode(4)
Tree1.left.right = BinaryTreeNode(5)
Tree1结构如下图。
暴力创建第二棵二叉树(Tree2),如下。
Tree2 = BinaryTreeNode(2)
Tree2.left = BinaryTreeNode(4)
Tree2.right = BinaryTreeNode(5)
Tree2结构如下图。
有了以上Tree1 和Tree2,可以直接看出来,Tree2就是Tree1的子结构,我们这里用Tree1和Tree2来测试一下前面所实现的函数 hasSubTree()。
>>> hasSubTree(Tree1,Tree2)
Out:
True
若是对Tree2进行略微改动,将右子节点改为6,如下。
>>> Tree2.right = BinaryTreeNode(6)
那么此时Tree1便不再包含Tree2了,即Tree2不再是Tree1d的子结构。
>>> hasSubTree(Tree1,Tree2)
Out:
False
空节点默认为任意一棵树的子结构,如下。
>>> Tree3 = BinaryTreeNode()
>>> hasSubTree(Tree1,Tree3)
Out:
True