前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode-面试题26-树的子结构

LeetCode-面试题26-树的子结构

作者头像
benym
发布2022-07-14 15:07:55
2520
发布2022-07-14 15:07:55
举报
文章被收录于专栏:后端知识体系后端知识体系

# LeetCode-面试题26-树的子结构

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

B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如: 给定的树 A:

代码语言:javascript
复制
     3
    / \
   4   5
  / \
 1   2

给定的树 B:

代码语言:javascript
复制
   4 
  /
 1

返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

示例1:

代码语言:javascript
复制
输入:A = [1,2,3], B = [3,1]
输出:false

示例2:

代码语言:javascript
复制
输入:A = [3,4,5,1,2], B = [4,1]
输出:true

限制:

0 <= 节点个数 <= 10000

# 解题思路

首先需要判断A和B根节点是否相同,如果相同则开启子树的匹配,如果不相同则需要判断A树的左右节点是否和B树根节点相同,再判断子树结构。

子树的判断用递归的思路来考虑,如果传入的A的根节点和B的根节点值不相同,则以A的根节点开始的子树肯定没有B子树相同的节点。如果他们的值是相同的则需要递归考虑,它们各自的左右节点的值是不是相同。

递归的终止条件是到达了树A或者树B的叶子节点,当树B的叶子节点为空的时候说明,B子树已经遍历完了,A包含B。而当A的叶子节点为空时,说明遍历完A也没有找到B子树,A不包含B

# Java代码

代码语言:javascript
复制
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        boolean result = false;
        if(A!=null&&B!=null){
            if(A.val==B.val)
                result = isSubTree(A,B);
            if(!result)
                result = isSubStructure(A.left,B);
            if(!result)
                result = isSubStructure(A.right,B);
        }
        return result;
    }

    public boolean isSubTree(TreeNode root1,TreeNode root2){
        if(root2==null)
            return true;
        if(root1==null)
            return false;
        if(root1.val!=root2.val)
            return false;
        return isSubTree(root1.left,root2.left)&&isSubTree(root1.right,root2.right);
    }
}

# Python代码

代码语言:javascript
复制
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def isSubStructure(self, A: TreeNode, B: TreeNode) -> bool:
        result = False
        if A and B:
            if A.val==B.val:
                result = self.helper(A,B)
            if not result:
                result = self.isSubStructure(A.left,B)
            if not result:
                result = self.isSubStructure(A.right,B)
        return result

    def helper(self,A:TreeNode,B:TreeNode)->bool:
        if not B: return True
        if not A: return False
        if A.val!=B.val: return False
        return self.helper(A.left,B.left) and self.helper(A.right,B.right)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • # LeetCode-面试题26-树的子结构
    • # 解题思路
      • # Java代码
        • # Python代码
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档