剑指offer(java实现)第17题“树的子结构 ”-牛客网

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zm13007310400/article/details/81193393

题目描述

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

时间限制:1秒 空间限制:32768K 热度指数:271259

解答:

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {//1.两个都是空树,2.其中一个是空树 3.是子结构 4.不是子结构   第一步先找到A树中与B树根节点相等的节点; 第二步:当找到这个节点后,比较他们两的子树
    //是否具有相同的结构。如果不相同,再继续去遍历A树,找到下一个与B树根节点相同的节点,再继续比较下去。。。
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if (null == root1 || null == root2) {
            return false;
        }
        boolean result = false;
        if (root1.val == root2.val) {//如果相等,表示找到了A树中与B二叉树的根节点的值相等的节点,接下来比较他们的左右子节点是否相等
            result = isEqual(root1, root2);
            if (!result) {//如果刚刚找到的与B根节点相等的A子树与B树的结构不相等时,继续遍历左子树
                result = HasSubtree(root1.left, root2);
            }
            if (!result) {//如果刚刚找到的与B根节点相等的A子树与B树的结构不相等时,继续遍历右子树
                result = HasSubtree(root1.right, root2);
            }
        }
        return result;
    }
    
   private boolean isEqual(TreeNode root1, TreeNode root2) {
       if (root2 == null) {//当root2此时为null时,表示B树遍历到叶子节点了都没出现不相等的情况,返回true
           return true;
       }
       if (root1 == null) {//当root1为null,此时root2还不为null,确定这不是相同的结构
           return false;
       }
       if (root1.val != root2.val) {//当两棵树比较的节点不相等时,确定不是相同的结构
           return false;
       }
       return isEqual(root1.left, root2.left) && isEqual(root1.right, root2.right);
   }
}

猜你喜欢

转载自blog.csdn.net/zm13007310400/article/details/81193393