剑指 Offer 26. 树的子结构(递归,二叉树)

Posted Kapo1

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

限制:

0 <= 节点个数 <= 10000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

主要的思想

  1. 先序遍历每个结点,并从每个遍历到的结点延申,判断是否有满足与二叉树 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 judgeTreeNode(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
    }
    public boolean judgeTreeNode(TreeNode A, TreeNode B) {
        // 如果结点 B 为空,说明结点 B 之前的所有子结构都已经判断过,且都满足子结构相同
        if(B == null) {
            return true;
        }
        // 如果结点 A 为空,说明结点 A 的所有结点都已经判断过,即不满足子结构相同
        if(A == null) {
            return false;
        }
        // 如果结点 A 和结点 B 的值不一样,那么返回假
        if(A.val != B.val) {
            return false;
        }
        // 递归遍历,当前的结点是否能延伸出满足与二叉树 B 一致的子结构
        return judgeTreeNode(A.left, B.left) && judgeTreeNode(A.right, B.right);
    }
}

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

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

剑指offer---18---(递归)(先序遍历)二叉树的镜像

剑指offer 18. 二叉树的镜像

乱序版 ● 剑指offer每日算法题打卡题解—— 搜索与回溯算法 (题号26,27, 28)

剑指offer二叉树的镜像python

剑指offer(三十四)之二叉树的镜像