每天一道算法题——树的子结构

题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
测试用例:
{8,8,7,9,3,#,#,#,#,4,7},{8,9,2}
对应输出应该为:
false

分析:

判断两棵树,如果彼此根节点不相同,则判断tree1的左子树和tree2是否相同,
再判断右子树和tree2是否相同,如果有一点没有满足就返回false
注意null的条件,HasSubTree中,如果两棵树都不为空才进行判断,
isSubTree中,如果Tree2为空,则说明第二棵树遍历完了,即匹配成功。所以要将tree2的判空放于tree1的判空前面。
tree1为空有两种情况(1)如果tree1为空&&tree2不为空说明不匹配,
(2)如果tree1为空,tree2为空,说明匹配。

源码:

class TreeNode {//树结构的定义类
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}
public class Test1 {
    private boolean isSubtree(TreeNode root1, TreeNode root2) {
        //如果root2已经遍历完了都能对应的,返回true,注意此时root2判空的位置是在root1前面的。
        if (root2 == null) {
            return true;
        } else if (root1 == null) {
            return false;
        }  else
            return root1.val == root2.val && isSubtree(root1.left, root2.left) && isSubtree(root1.right, root2.right);
    }

    public boolean HasSubtree(TreeNode root1, TreeNode root2) {
        //当root1和root2都不为零的时候,才进行比较。否则直接返回false
        if (root2 == null || root1 == null) {
            return false;
        } else {
            //如果找到了对应root2的根节点的点,以这个根节点为为起点判断是否包含root2,
            //如果找不到,那么就再去root的左儿子当作起点,去判断时候包含root2
            //如果还找不到,那么就再去root的右儿子当作起点,去判断时候包含root2
            return isSubtree(root1,root2) || HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2);
        }
    }
}

运行测试:

运行时间:21ms
占用内存:8500k
从测试结果可以看出,确实是差不多的。

总结:
此题的难点在于如果root2已经遍历完了都能对应的(即root2为null时),返回true,注意此时root2判空的位置是在root1前面的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值