Leetcode 剑指 offer 26.树的子结构 | 刷题打卡

197 阅读2分钟

一、题目描述

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

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

例如:

给定的树 A:

给定的树 B:

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

二、思路分析

因为树 B 是树 A 的子结构,那么 B 的根节点可以是 A 中的任意一个节点,所以我们需要依次将 B 的根节点与 A 中的所有节点进行比较,如果相同,则开始比较 A 中的子结构与 B 是否完全相同,比较的方法也很简单,就是从根节点开始,依次比较 A 中子结构的左右节点与 B 中的左右节点是否相同。

步骤:

  1. 在 A 中找出与 B 根节点相同的节点
  2. 从此节点开始递归遍历下面节点是否与 B 相同。

结束条件:

  1. 如果 B 中已经为null,那么即使 A 中依然存在节点,也不需要继续遍历了,直接返回 true。
  2. 如果 A 中已经为null,那么 A 中就不存在 B 中存在的节点,直接返回 false。
  3. 如果 B 中节点与 A 中的节点不相同,直接返回 false。

三、AC 代码

public boolean isSubStructure(TreeNode A, TreeNode B) {
    if(B == null || A == null) return false;
    // 比较 A 中所有节点与 B 的根节点
    return helper(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
}

public boolean helper(TreeNode A, TreeNode B){
    if(B == null) return true;
    if(A == null) return false;
    if(A.val != B.val) return false;
	
    // 依次判断 A 和 B 中左右节点是否相同
    boolean left = helper(A.left, B.left);
    boolean right = helper(A.right, B.right);
    return left && right;
}

四、总结

本题主要考察的就是对树的遍历掌握得是否得当,难度不大,但是需要思路清晰。树的遍历无非就是使用递归,依次使用它的左节点和右节点作为遍历的参数即可。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情