JZ26 树的子结构(中)

描述

输入两棵二叉树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 class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

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

    }

}
*/
public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        boolean result = false;
        if(root2 != null && root1 != null){
            if(root1.val == root2.val){
                result = ToCompare(root1,root2);
            }
            //如果根节点不相等,则以左节点为根节点
            if(!result){
                result = HasSubtree(root1.left,root2);
            }
            //如果左子树的都不相等,则以右节点为根节点继续查找
            if(!result){
                result = HasSubtree(root1.right,root2);
            }
        }
        return result;
    }
    public boolean ToCompare(TreeNode r1,TreeNode r2){
        //如果r2遍历完,则返回ttue
        if(r2 == null){
            return true;
        }
        //如果r1为空,r2还没遍历完
        if(r1 == null){
            return false;
        }
        
        //如果其中有一个点没有对应上,返回false
        if (r1.val != r2.val) {  
              return false;
        }
        return ToCompare(r1.left,r2.left) && ToCompare(r1.right,r2.right);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_47465999/article/details/121499095