面试题26:树的子结构

题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

知识点

二叉树


Qiang的思路

这道题主要考虑的是二叉树的遍历。典型的,我们可以通过递归的方式实现二叉树的遍历。

想要判断B是不是A的子结构,自然需要对A和B进行遍历。首先,需要找到遍历的起始点,通过遍历树A,我们能找到在A中和B的根节点相同的节点。然后对于这些节点,同时遍历A和B,看一下是不是以该节点开头的子树的一部分和B相同,如果相同则证明B就是A的子结构,如果所有节点都不满足条件,那就说明B不是A的子结构。

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def getResult(self, pRoot1, pRoot2):
        if pRoot2==None:
            return True
        if pRoot1==None:
            return False
        if pRoot1.val!=pRoot2.val:
            return False
        result1=self.getResult(pRoot1.left, pRoot2.left)
        result2=self.getResult(pRoot1.right, pRoot2.right)
        if result1==True and result2==True:
            return True
        return False
           
    def HasSubtree(self, pRoot1, pRoot2):
        # write code here
        if pRoot1==None or pRoot2==None:
            return False
        if pRoot1.val==pRoot2.val:
            if self.getResult(pRoot1, pRoot2)==True:
                return True
        result1=self.HasSubtree(pRoot1.left, pRoot2)
        result2=self.HasSubtree(pRoot1.right, pRoot2)
        if result1==True or result2==True:
            return True
        return False

在编写代码的过程中,需要注意的一点就是判断是不是子结构的终止条件。因为当B是子结构时,并不意味这他就是子树,所以当遍历到B的叶子节点时就认为当前所判断的均满足子结构的条件,并不需要A和B同时满足子节点。


作者原创,如需转载及其他问题请邮箱联系:[email protected]
个人网站:https://www.myqiang.top。

你可能感兴趣的:(面试题26:树的子结构)