剑指17:树的子结构

222 阅读1分钟

题目描述

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

思路很明确,就是循环遍历一个树的节点到另一个树上去找;只不过这里的循环是用递归来处理的。

但是怎么找呢?首先看一个节点是否相等,相等后开始遍历该节点后的左右子树,如果相等,那么就找到了。这是个递归1。

当子节点不等,那么就要从新换原树的节点了。递归2

拿到一个题目,我们要考虑到边界是否考虑清楚。

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
//先找一个节点是否相等,若等,递归后续节点(递归2);不等,移到左子树(递归1)
}
*/
public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        //边界判断
             //2.两个树是否为null
        if(root2==null||root1==null){
            return false;
        }
            //1.根是否相等
        if(root1==root2){
            return true;
        }
       
        boolean result=false;
        if(root1.val==root2.val){
            //递归2  调用子树
            result=Match(root1,root2);
        }
        if(result){
            return true;
        }  
        //到这里,说明子树不匹配,到原树左右树去找(递归1)
            return HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2);
        }
      
    
    
    public boolean Match(TreeNode root1,TreeNode root2) {
        if(root1==root2){
            return true;
        }
        // 只要树B的根结点点为空就返回true
        if (root2 == null) {
            return true;
        }
        // 树B的根结点不为空,如果树A的根结点为空就返回false
        if (root1 == null) {
            return false;
        }
        if(root1.val==root2.val){
            return Match(root1.left,root2.left)&&Match(root1.right,root2.right);
        }
        return false;
    }      
}