题目

输入两棵二叉树 A 和 B,判断 B 是不是 A 的子结构。

如下给你两棵树:

问题分析

我们要判断一个二叉树是否为另一个二叉树的子结构,如图,判断二叉树 B 是否为二叉树 A 的子结构,就需要从二叉树的 A 的根节点和二叉树 B 的根节点起开始判断。

如果两个二叉树的根节点相同的时候,我们就分别递归判断剩余的结点是否相同,如果相同,则 B 为 A 的子结构,否则,我们就判断其他的 A 的子结构是否和 B 的结构相同。

既然问题我们已经分析清楚了,我们开始手写代码。

动画实现

代码拆解

第一步,判断传入的两棵树是否为空,如果 A 树为空,则返回null。如果 B 树为空,则是 A 树的子结构返回 true。

1// 匹配的返回值2const result = false;34// 判断两棵树是否为空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 版本


测试用例

  • 是子结构、不是子结构 —— 普通测试。
  • 只有左子节点、只有右子节点、只有一个结点 —— 特殊测试。
  • 空树 —— 输入测试。
©著作权归作者所有:来自51CTO博客作者mb5fe1601ede528的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. php设计模式之组合模式——处理树形结构数据
  2. 解析PHP标准库SPL数据结构
  3. 教你用php实现栈结构
  4. PHP实现抓取百度搜索结果,并分析数据结构
  5. 教你用php读取elf结构
  6. 树状数据结构存储方式(查询篇)
  7. 树状数据结构存储方式(CUD 篇)

随机推荐

  1. golang无法导包怎么办?
  2. golang无法解析json怎么办?
  3. go语言值传递介绍
  4. golang如何实现协程?
  5. Golang 能做前端吗?
  6. Golang 可以把包名去掉吗?
  7. golang如何学习?
  8. golang需要什么基础?
  9. 分享十个优秀的 Go 类库
  10. go语言中自定义包的方法