zoukankan      html  css  js  c++  java
  • 树的子结构

    ##题目描述 输入两棵二叉树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解决。

  • 相关阅读:
    leetcode刷题
    剑指offer题解
    哈夫曼树和哈夫曼编码
    HashMap的扩容机制---resize()
    缓存穿透,缓存击穿,缓存雪崩解决方案分析
    字符串的排列组合问题
    乐观锁与悲观锁以及乐观锁的一种实现方式-CAS
    HTTP相关
    零散知识点
    Java大数相加
  • 原文地址:https://www.cnblogs.com/ustca/p/12327874.html
Copyright © 2011-2022 走看看