剑指 Offer 26. 树的子结构-递归

Posted hequnwang10

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 26. 树的子结构-递归相关的知识,希望对你有一定的参考价值。

一、题目描述

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

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

例如:
给定的树 A:

 3
/ \\

4 5
/
1 2
给定的树 B:

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

示例 1:
输入:A = [1,2,3], B = [3,1]
输出:false

示例 2:
输入:A = [3,4,5,1,2], B = [4,1]
输出:true

二、解题

递归

判断A的节点是否和B的节点相等,如果相等则递归执行看看A和B的左右节点是否相等,这里的跳出条件必须是按照顺序写

  • 先写return true的条件,如果B为空,遍历结束了,上面的节点都没有返回false,说明A和B是子结构;
  • 其次在写return false的条件,如果A为空或者A和B的节点值不相等,则说明不是子结构
/**
 * 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) 
        if(A == null || B == null)
            return false;
        
        
        return isSubTree(A,B) || isSubStructure(A.left,B) || isSubStructure(A.right,B);
    
    public boolean isSubTree(TreeNode A, TreeNode B)
        //终止条件
        //这两个的终止条件的顺序不能乱,必须先判断B是否为空,为空说明已经遍历完了,是子结构,
        //如果A为空或者两个根节点不相等,说明两个树不是子结构
        if(B == null)
            return true;
        
        if(A == null || A.val != B.val)
            return false;
        
        return isSubTree(A.left,B.left) && isSubTree(A.right,B.right);
    

时间复杂度:O(MN), 其中 M,N 分别为树 A 和 树 B 的节点数量;

空间复杂度:O(M)。

以上是关于剑指 Offer 26. 树的子结构-递归的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer 26. 树的子结构

《从头再来》剑指offer.26 树的子结构

剑指offer-树的子结构

剑指offer树的子结构

剑指offer:树的子结构

剑指offer——树的子结构