0
点赞
收藏
分享

微信扫一扫

JZ26 树的子结构

蓝莲听雨 2022-05-06 阅读 30
数据结构

描述

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

假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构

数据范围:

0 <= A的节点个数 <= 10000

0 <= B的节点个数 <= 10000

示例1

输入:

{8,8,7,9,2,#,#,#,#,4,7},{8,9,2}

返回值:

true

示例2

输入:

{1,2,3,4,5},{2,4}

返回值:

true

示例3

输入:

{1,2,3},{3,1}

返回值:
false

看完解析后,自己敲的代码:

递归代码:

   public boolean HasSubtree(TreeNode root1,TreeNode root2) {//只是遍历找匹配的根节点而已
        if(root2==null) return false;//空树不是任意一个树的子结构
        if(root1==null) return false;//这颗子树肯定没有 返回false
        if(root1.val==root2.val) {
            //找到与树2根相同得节点了 "摘下"以root1为根的子树开始同步遍历
            boolean f0=judge(root1,root2);
            if(f0) return true;//找到了直接返回 不递归了
        }

        boolean f1=HasSubtree(root1.left,root2);//大体结构 先序遍历root1 找与root2根相同的节点
        boolean f2=HasSubtree(root1.right,root2);//大体结构 先序遍历root1 找与root2根相同的节点  别忘记改成right

        return f1||f2;//左子树或者右子树找到匹配的均可
    }

    //真正核心 同步遍历了
    private boolean judge(TreeNode root1, TreeNode root2) {//此处初始root1 root2一定均不为null
        if(root2==null) return true;//root2遍历到null了  root1可以多点没事,正常结尾 这个分支不需要走了
        if(root1==null) return false;//此处root2肯定不为null root1却没了 必然不行
        if(root1.val!=root2.val){
            return false;//严格同步遍历到的值不等 肯定不行
        }
        //否则就是相等了 继续严格同步遍历下去即可
        boolean f1=judge(root1.left,root2.left);//完全严格同步地先序遍历了
        boolean f2=judge(root1.right,root2.right);//完全严格同步地先序遍历了

        return f1&&f2;//左右子树都重来没有返回false才行
    }

递归代码2:只是写好后再单纯地在语法层面进行了简化而已 (看起来又好厉害的亚子)

    public boolean HasSubtree(TreeNode root1,TreeNode root2) {//只是遍历找匹配的根节点而已
        if(root2==null||root1==null) return false;//空树不是任意一个树的子结构
        if(root1.val==root2.val && judge(root1,root2))  return true;
        return HasSubtree(root1.left,root2)||HasSubtree(root1.right,root2);//左子树或者右子树找到匹配的均可
    }
    //真正核心 同步遍历了
    private boolean judge(TreeNode root1, TreeNode root2) {//此处初始root1 root2一定均不为null
        if(root2==null) return true;//root2遍历到null了  root1可以多点没事,正常结尾 这个分支不需要走了  正常结尾返回true
        if(root1==null||root1.val!=root2.val) return false;//此处root2肯定不为null root1却没了 必然不行
        return judge(root1.left,root2.left)&&judge(root1.right,root2.right);//左右子树都重来没有返回false才行
    }

方法二:非递归解法

未完待续 TODO

举报

相关推荐

0 条评论