您的位置:首页 > 职场人生

动画:面试必刷之二叉树的子结构

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 版本


测试用例

  • 是子结构、不是子结构 —— 普通测试。
  • 只有左子节点、只有右子节点、只有一个结点 —— 特殊测试。
  • 空树 —— 输入测试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: