东寻

导航

树的子结构

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

思路

因为题解的特殊边界问题和搜索树时的跨层问题,需要将递归拆分和改造。
时间复杂度O(n),空间复杂度O(n)。

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    private boolean isSubTree(TreeNode A,TreeNode B, int deep) {
        if(B == null)   return true;
        if(A == null)   return false;
        boolean flag = false;
        if(A.val == B.val) {
            // deep参数解决递归搜索时的跨层搜索问题
            flag = isSubTree(A.left, B.left, 2) && isSubTree(A.right, B.right, 2);
        }
        // 仅当两树比对进行到第一层并不满足相等时,才搜索A的子树
        // 若比对进行到非第一层,出现val不等则false
        if(!flag && deep == 1) {
            flag = isSubTree(A.left, B, 1) || isSubTree(A.right, B, 1);
        }
        return flag;
    }

    public boolean HasSubtree(TreeNode A, TreeNode B) {
        boolean flag = false;
        //递归出口的判断依赖于A、B的非空情况,根据题目ps的特殊要求,需要A、B都不空再递归
        if(A != null && B != null) {
            flag = isSubTree(A, B, 1);
        }
        return flag;
    }
}

笔记

树的边界问题,跨层搜索问题可以通过递归携带deep解决。

posted on 2020-02-18 20:42  东寻  阅读(189)  评论(0编辑  收藏  举报