(多理解)剑指offer系列-树的子结构

(一)题目描述

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

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

(二)解题思路

1、首先遍历A树(isSubStructure(A, B))

2、然后将遍历的A树的每个节点 为根节点,判断其是否包含B树(recur(A, B))

具体解法:

isSubStructure(A, B) 函数:

特例处理: 当 树 A 为空 或 树 B 为空 时,直接返回 false ;(因空不为任一子结构)
返回值: 若树 B是树 A 的子结构,则必满足以下三种情况之一,因此用或 || 连接;
(1)以 节点 A 为根节点的子树包含树 B ,则调用 recur(A, B);
(2)树 B是 树 A 左子树 的子结构,则先遍历A的左节点 isSubStructure(A.left, B);
(3)树 B是 树 A 右子树 的子结构,则遍历A的右节点 isSubStructure(A.right, B);

(三)代码如下

class Solution10{
//    isSubStructure()遍历A中每个节点
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        if(A==null || B==null)
            return false;//约定空树不是任意一个树的子结构
        if(helper(A,B))
            return true;
        return isSubStructure(A.left,B) || isSubStructure(A.right,B);//递归判断A树所有子树是否包含B树
    }
        //该函数的作用是:判断A树根节点值和B树根节点值是否相等,若不等,返回false
        // 若相等,再递归判断A树的孩子节点和B树的的孩子节点是否对应相等,如果对应相等了,就说明A的子结构包含B树,返回true。
        // 否者就不包含,返回false
        public boolean helper(TreeNode A,TreeNode B){
            if(B==null)
                //B树遍历完,则说明相等
                return true;
            //A树为空或者A节点的值不等于B结点的值,返回false
            if(A==null || A.val!=B.val)
                return false;
            //当A.val==B.val时,递归判断A树的子节点和B树的子节点是否对应相等
            return helper(A.left,B.left) && helper(A.right,B.right);
        }
}

心得:对于树的很多递归题,想清楚如何分解为子问题就好做了,函数内调用递归函数不要太纠结细节,清楚函数的功能就行 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值