树的子结构

题目描述

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

注意的问题

把每个函数的作用弄清楚:

  1. HasSubtree(TreeNode root1,TreeNode root2):以root2为根的树是否可以是以root1为根的树的子结构。当root1和root2都不为空时,若root1.val != root2.val,此时root2的树如果能是root1的子结构,必然有两种情况:①以root2为根的树是以root1.left为根的树的子结构。②以root2为根的树是以root1.right为根的树的子结构。否则,有三种情况:①以root2为根的树是以root1为根的树的子结构,且root2的位置与root1重合。②以root2为根的树是以root1.left为根的树的子结构。③以root2为根的树是以root1.right为根的树的子结构。
  2. check(TreeNode node1, TreeNode node2):node2以及其下面的节点能否与node1重合,即以node2为根的树是否可以是以node1为根的树的子结构,且node2必须在node1的位置上。

代码

/**
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) {
        if(root2 == null){
            return false;
        }
        if(root1 == null){
            return false;
        }
        //root1不能与root2重合
        if(root1.val != root2.val){
            //向下搜索:root2可能与root1.left或root1.right重合
            return HasSubtree(root1.left,root2) || HasSubtree(root1.right, root2);
        }else{//root1可能与root2重合
            //判断root1是否能与root2重合
            //也有可能是root2与root1.left或root1,right重合
            return check(root1, root2) || HasSubtree(root1.left,root2) || HasSubtree(root1.right, root2);
        }
    }
    //检查以node1为根节点的t1是否包含以node2为根节点的t2,node1必须与node2重合
    private boolean check(TreeNode node1, TreeNode node2){
        if(node2 == null){
            return true;
        }
        if(node1 == null){
            return false;
        }
        if(node1.val != node2.val){
            return false;
        }
        return check(node1.left, node2.left) && check(node1.right, node2.right);
        
    }
}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页