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


    点击蓝色 “五分钟学算法” 关注我哦!

    加个 “星标” ,每天一篇动画喂饱你!

    作者 |  小鹿

    来源 |  小鹿动画学编程

    题目

    输入两棵二叉树 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 版本

    测试用例

    • 是子结构、不是子结构 —— 普通测试。

    • 只有左子节点、只有右子节点、只有一个结点 —— 特殊测试。

    • 空树 —— 输入测试。

    -----------------------

    公众号:五分钟学算法(ID:CXYxiaowu

    博客:www.cxyxiaowu.com

    知乎:程序员吴师兄

    一个正在学习算法的人,致力于将算法讲清楚!

    长按下图二维码关注,和你一起领悟算法的魅力

    戳一下下方的小程序,24 小时一起学算法

  • 相关阅读:
    [Zjoi2006]GameZ游戏排名系统
    二逼平衡树
    郁闷的小J
    Dynamic Rankings
    数列[专杀Splay版]
    星际争霸
    半平面交
    自适应辛普森
    7月31日
    规约先行-(三)代码格式
  • 原文地址:https://www.cnblogs.com/csnd/p/16675056.html
Copyright © 2020-2023  润新知