数据结构与算法-树(四):剑指offer-树的子结构

树的子结构

题目

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

解析

本题全程使用递归,因为要遍历树嘛,第一反应就可能需要递归来解决。那怎么解决呢?
两点:
第一点:A树从上到下遍历,看有没有两棵树的根节点的值相同
第二点:如果在某一个位置上,两棵树的根节点值相同,判断这个根节点往下,是否有相同的树结构。
注意是先判断有没有相同的结构,如果结构都不相同就不用判断值了,继续往下找有没有相同的根节点值;

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def HasSubtree(self, pRoot1, pRoot2):
        # write code here
        result = False
        # 只有两个树存在了,才能继续判断
        if pRoot1 and pRoot2:
            # 判断两个树的根节点是否一样
            if pRoot1.val == pRoot2.val:
                # 当两个根节点的值存在了,判断是否有相同的树结构
                # 要判断是否有相同的树结构,先定义一个判断树结构的函数
                result = self.isEqual(pRoot1, pRoot2)  # result为bool值
                
                # result不存在,就证明根节点即使相同,也没有相同的结构
            if not result:
                result = self.HasSubtree(pRoot1.left, pRoot2)
                # 如果结构依旧不存在,就证明根节点与左子树都不存在有B树相同的东西,判断右节点    
            if not result:
                result = self.HasSubtree(pRoot1.right, pRoot2)
        return result
                
    def isEqual(self, root1, root2):
        # root1:A树;roo2:B树
        # 如果B树为空,那么直接就返回true(注意这个判断不是最上面的跟,根节点已经由主函数判断了)
        if not root2:
            return True
        # 如果A树为空,那么直接返回False
        if not root1:
            return False
        # 如果两个节点值都不一样,返回FALSE
        if root1.val != root2.val:
            return False
        # 以上对于最上面的根节点都无效,而是在递归过程中需要这些出口
        return self.isEqual(root1.left,root2.left) and self.isEqual(root1.right,root2.right)
            

发布了49 篇原创文章 · 获赞 2 · 访问量 1821

猜你喜欢

转载自blog.csdn.net/liuluTL/article/details/105142610