湘阴网站设计,象刀设计网站,亚马逊网站怎么做推广,附近有没有学电脑培训的摘要
剑指 Offer 26. 树的子结构
输入两棵二叉树A和B#xff0c;判断B是不是A的子结构。(约定空树不是任意一个树的子结构)#xff0c;B是A的子结构#xff0c; 即 A中有出现和B相同的结构和节点值。
一、子树解析
思路解析#xff1a;若树B是树A的子结构#xff0c;则…摘要
剑指 Offer 26. 树的子结构
输入两棵二叉树A和B判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构 即 A中有出现和B相同的结构和节点值。
一、子树解析
思路解析若树B是树A的子结构则子结构的根节点可能为树A的任意一个节点。因此判断树 B是否是树A的子结构需完成以下两步工作
先序遍历树A中的每个节点nA 对应函数 isSubStructure(A, B)。判断树A中以nA为根节点的子树是否包含树B 。对应函数 recur(A, B)树A的根节点记作节点A 树B的根节点称为节点B。
recur(A, B) 函数
终止条件
当节点B为空说明树B已匹配完成越过叶子节点因此返回true 当节点A为空说明已经越过树A叶子节点即匹配失败返回false 当节点A和B的值不同说明匹配失败返回false
返回值
判断A和B的左子节点是否相等即 recur(A.left, B.left) 判断A和B的右子节点是否相等即 recur(A.right, B.right)
isSubStructure(A, B) 函数
特例处理 当 树A为空 或 树B为空时直接返回 false
返回值 若树B是树A的子结构则必满足以下三种情况之一因此用或 || 连接
以 节点A为根节点的子树 包含树B对应 recur(A, B)树B是树A左子树的子结构对应 isSubStructure(A.left, B)树B 是树A右子树的子结构对应 isSubStructure(A.right, B)package Tree;/*** Classname JZ26树的子结构* Description TODO* Date 2023/2/20 22:37* Created by xjl*/
public class JZ26树的子结构 {public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val x;}}/*** description 判断一个树是否为一个树的子树 * param: A* param: B* date: 2023/2/20 22:40* return: boolean* author: xjl*/public boolean isSubStructure(TreeNode A, TreeNode B) {return (A ! null B ! null) (recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B));}boolean recur(TreeNode A, TreeNode B) {if(B null) {return true;}if(A null || A.val ! B.val) {return false;}return recur(A.left, B.left) recur(A.right, B.right);}
}复杂度分析
时间复杂度O(MN) 其中 M,N分别为树A和 树B的节点数量先序遍历树A占用 O(M)每次调用 recur(A, B) 判断占用O(N) 。空间复杂度O(M) 当树A和树B都退化为链表时递归调用深度最大。当 M≤N时遍历树A与递归判断的总递归深度为M 当 MN时最差情况为遍历至树A 叶子节点此时总递归深度为 M。
博文参考
《leetcode》