动画:面试必刷之二叉树的子结构
2021-01-21 22:23
603 查看
题目
输入两棵二叉树 A 和 B,判断 B 是不是 A 的子结构。
如下给你两棵树:
问题分析
我们要判断一个二叉树是否为另一个二叉树的子结构,如图,判断二叉树 B 是否为二叉树 A 的子结构,就需要从二叉树的 A 的根节点和二叉树 B 的根节点起开始判断。
如果两个二叉树的根节点相同的时候,我们就分别递归判断剩余的结点是否相同,如果相同,则 B 为 A 的子结构,否则,我们就判断其他的 A 的子结构是否和 B 的结构相同。
既然问题我们已经分析清楚了,我们开始手写代码。
动画实现
代码拆解
第一步,判断传入的两棵树是否为空,如果 A 树为空,则返回null。如果 B 树为空,则是 A 树的子结构返回 true。
1// 匹配的返回值 2const result = false; 3 4// 判断两棵树是否为空 5if(NodeA == null || NodeB == null){ 6 return null; 7}
第二步,如果两棵树不为空,则判断两棵树的根节点是否相同。
1// 根节点相等就进行匹配 2if(NodeA.data == NodeB.data){ 3 result = match(NodeA,NodeB); 4}
第三步,如果两棵树的根节点相同,则进行匹配。匹配过程是一个递归的过程。
1// 开始匹配 2const match = (NodeA,NodeB)=>{ 3 // 终止条件 4 if(nodeB == null){ 5 return true; 6 } 7 if(nodeA == null){ 8 return false; 9 } 10 // 如果匹配的当前结点相等,继续匹配下面的结点 11 if(nodeA.data == nodeB.data){ 12 return match(NodeA.left,NodeB.left) && match(NodeA.right,NodeB.right); 13 }else{ 14 return false; 15 } 16}
第四步,如果两棵树根节点不相同,则也对其余节点进行递归遍历,找其他树节点是否存在根节点相同的节点。
1 // 判断上述过程是否匹配成功 2 if(result){ 3 return true; 4 } 5 // 继续匹配其他节点 6 return matchTree(NodeA.left,NodeB) || matchTree(NodeA.right,NodeB)
代码实现
JavaScript 版本
Java 版本
Python 版本
测试用例
- 是子结构、不是子结构 —— 普通测试。
- 只有左子节点、只有右子节点、只有一个结点 —— 特殊测试。
- 空树 —— 输入测试。
相关文章推荐
- 动画:面试必刷之二叉树的镜像
- 笔试面试算法经典--二叉树的子结构(Java)
- 动画:面试必刷之对称的二叉树
- 面试题目集锦--二叉树
- iOS面试——动画
- 面试经典(5)--二叉树最低公共祖先LCA
- 轻松搞定面试中的二叉树题目
- 二叉树基础题(六):树的子结构&二叉搜索树的判断&镜像二叉树
- 轻松搞定面试中的二叉树题目
- Java面试--二叉树的遍历
- 输入两颗二叉树A,B,判断B是不是A的子结构
- [置顶] 轻松搞定面试中的二叉树题目
- 二叉树两个结点的最低公共父结点 【微软面试100题 第七十五题】
- 面试之---二叉树的遍历
- 面试中的二叉树问题
- 【LeetCode-面试算法经典-Java实现】【145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)】
- 数据结构 算法面试100题 之 二叉树转换成双向链表
- 【数据结构】面试搞定二叉树大总结-15道二叉树题
- 用C语言判断一个二叉树是否为另一个的子结构
- 面试算法题:二叉树的平衡性检测