剑指 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. 树的子结构-递归的主要内容,如果未能解决你的问题,请参考以下文章