题目描述

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

答案

public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        boolean result = false;
        if(root1!=null&&root2!=null){
            if(root1.val==root2.val){
               result =  doesTree1HaveTree2(root1,root2);
            }
            if(!result){
              result = HasSubtree(root1.left,root2);
            }
            if(!result){
              result = HasSubtree(root1.right,root2);
            }
        }
        return result;
    }
    public static boolean doesTree1HaveTree2(TreeNode node1, TreeNode node2){
        if(node2==null){
            return true;
        }
        if(node1==null){
            return false;
        }
        if(node1.val==node2.val){
            return doesTree1HaveTree2(node1.left,node2.left)&&doesTree1HaveTree2(node1.right,node2.right);
        }
        return false;
    }
}

分析

  1. 遍历A树,找到跟B树根节点相等的结点
  2. 将这两个结点扔进判断函数做判断
  3. 判断函数优先判断B树是否遍历结束,结束则说明包含
  4. 再判断A树是否遍历结束,结束则说明不包含
  5. 如果相等则继续递归,直到结果出来
  6. 返回HasSubtree函数,如果发现不包含,继续向左子树和右子树遍历,继续找新的跟B树根节点相等的结点,重复以上步骤

醉后不知天在水,满船清梦压星河