TypechoJoeTheme

Toasobi的博客

树的子结构(中等)

本文最后更新于2023年03月14日,已超过555天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

这道题一看就是可以用递归判断是否是子结构,但是一开始我不打算使用递归,而是想从表示树的数组中看出一些规律出来(失败了)。所以还是得用递归:

本题的递归思路是:拿A和B进行判断,判断根节点值是否相等?如果相等,再判断左右子节点值是否都相等(在判断的时候一旦A 等于null了说明B比A还要长一截,肯定不是子树。相反如果B等于null了,说明B短一截,肯定就是子树了)。如果相等返回true,不相等则出来继续匹配A和B的左右节点。

代码如下:

<div>class Solution {
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        //0.题目约定空树不是子树
        if(B==null){return false;}
        return search(A,B);
    }
    private boolean compare(TreeNode A, TreeNode B){
        if(B == null){
            //5.A不一定要为空,因为B是A的子树,比如[1]是[1,3]的子树
            return true;
        }
        if(A == null){
            //6.A为空,B不为空必然不是子树
            return false;
        }
        //7.判断当前节点相不相等,左右子树相不相等
        return A.val == B.val && compare(A.left,B.left) && compare(A.right,B.right);
    }
    //1.先序遍历找到A中B的根节点位置
    private boolean search(TreeNode A, TreeNode B){
        //2.和先序打印二叉树一样,终止条件是节点为空
        if(A == null){
            //优化方案,这里可以写到isSubStructure里去:if(A == null || B == null) return false;
            return false;
        }
        //3.在先序打印二叉树里我们会在这里打印节点的值
        //4.在本题中我们比较该节点的值是否和B根节点相同,如果相同再判断是子树不是相同结构
        if(A.val == B.val && compare(A,B)){
            return true;
            //优化方案:这里的比较值其实与compare()里的比较是重复的
            //优化方案:所以可以合并下面那句写成compare(A,B) || search(A.left,B) || search(A.right,B);
        }
        //遍历左子树,遍历右子树
        return search(A.left,B) || search(A.right,B);
    }
}
</div>
朗读
赞(0)
评论 (0)