剑指Offer——树的子结构(JS实现)

简介: 剑指Offer——树的子结构(JS实现)

题目描述

image.png

解题思路

  • 本题采用两个递归互相调用的方式进行求解
  • 一个树是否是另一个树的子结构,有3种情况
  • 情况一:子树和当前节点完全一致
  • 情况二:子树在左子树中
  • 情况三:子树在右子树中
  • 第一个递归用于控制发生的是哪一种情况
  • 第二个递归则用于进行遍历,如果A树为空,说明A数遍历完了都没有匹配到,说明B树不是子树,如果B树为空,说明B树遍历完了,说明B树是子树,如果A和B的值不相同,则返回false,此时也许会有疑问,那万一子结构在树的深部岂不是直接返回false了?这是第一个递归就开始发挥作用了。
  • 本题的难点在于:如果只有一个递归,当A和B的值不同时,若直接返回false,显然不合理,但是如果不返回false,后续很难进行

解题代码

var isSubStructure = function(A, B) {
    // 判断是否是树的子结构有两种情况
    // 情况1:当前节点是子结构
    // 情况2:当前节点的左右子树是子结构
    // 如果A节点为空,或者B节点为空,都说明不是子树
    if (!A || !B) {
        return false;
    }
    return (dfs(A,B) || isSubStructure(A.left,B) || isSubStructure(A.right,B));
    function dfs(A,B) {
        // 如果B的节点为空,说明B已经遍历完了,说明此时B是A的子结构
        if (!B) {
            return true;
        }
        // 如果A都遍历完了,说明B不是子结构
        if (!A) {
            return false;
        }
        // 如果当前节点不同,则返回false
        if (A.val !== B.val) {
            return false;
        }
        // 当前节点相同,还要判断当前节点的左右子树是否都相同
        return (dfs(A.left,B.left) && dfs(A.right,B.right));
    }
};

总结(本题给我们的启示思路)

  • 启示一:学会使用两个递归进行互补计算
  • 启示二:多考虑边界条件
相关文章
|
3月前
|
存储 JSON JavaScript
「offer来了」保姆级巩固你的js知识体系(4.0w字)
该文章提供了JavaScript知识体系的全面复习资料,覆盖了从基础语法到高级特性如闭包、原型链、异步编程等多个方面,并通过大量的面试题和实例代码帮助巩固理解。
「offer来了」保姆级巩固你的js知识体系(4.0w字)
|
5月前
|
算法 JavaScript
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
78 0
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
|
6月前
|
JavaScript 前端开发 算法
虚拟DOM是React的关键技术,它是个轻量的JS对象树,模拟实际DOM结构。
【6月更文挑战第27天】虚拟DOM是React的关键技术,它是个轻量的JS对象树,模拟实际DOM结构。当状态改变,React不直接修改DOM,而是先构建新的虚拟DOM树。通过 diff 算法比较新旧树,找到最小变更,仅更新必要部分,提高性能,避免频繁DOM操作。虚拟DOM还支持跨平台应用,如React Native。它优化了更新流程,简化开发,并提升了用户体验。
47 1
|
5月前
|
JavaScript
js 解析和操作树 —— 获取树的深度、提取并统计树的所有的节点和叶子节点、添加节点、修改节点、删除节点
js 解析和操作树 —— 获取树的深度、提取并统计树的所有的节点和叶子节点、添加节点、修改节点、删除节点
144 0
|
7月前
|
前端开发 JavaScript 算法
JavaScript 中实现常见数据结构:栈、队列与树
JavaScript 中实现常见数据结构:栈、队列与树
|
7月前
|
JavaScript 前端开发
剑指 Offer 31. 栈的压入、弹出序列 (javascript实现)
剑指 Offer 31. 栈的压入、弹出序列 (javascript实现)
|
7月前
|
JavaScript
理解DOM树的加载过程(js的问题)
理解DOM树的加载过程(js的问题)
33 0
|
JavaScript
使用JS 实现二叉查找树(Binary Search Tree)
使用JS 实现二叉查找树(Binary Search Tree)
78 0
|
7月前
|
JSON JavaScript 前端开发
js(递归函数)实现树型菜单
js(递归函数)实现树型菜单
56 0
|
7月前
|
JavaScript 前端开发
JavaScript题解剑指offer : 09. 用两个栈实现队列
JavaScript题解剑指offer : 09. 用两个栈实现队列
46 0