全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

数据结构与算法中二叉树子结构的详解

数据结构与算法中二叉树子结构的详解

需求

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

树的描述:

class TreeNode {
  int val = 0;
  TreeNode left = null;
  TreeNode right = null;

  public TreeNode(int val) {
    this.val = val;

  }
}

解决思路

使用了栈将元素入栈,并不断的弹出元素,弹出一个元素的时候,拼接成字符串,并用特殊符号进行区分,该方法主要是按照先序遍历的方式将树节点的数据信息拼接为字符串,这样,两个树的节点拼接而成的串进行判断是不是包含。

不过,有的资料上说可以通过递归的方式进行,但是我感觉以及实践以后发现是错误的。后面会给出代码,读者自行尝试。

public static boolean HasSubtree2(TreeNode root1, TreeNode root2) {

    if (root2 == null)
      return false;
    String str = "";
    Stack<TreeNode> stack = new Stack<TreeNode>();
    stack.push(null);
    stack.push(root1);
    TreeNode node = null;
    while ((node = stack.pop()) != null) {
      str += '_' + node.val + '_';

      if (node.right != null) {
        stack.push(node.right);
      }
      if (node.left != null) {
        stack.push(node.left);
      }
    }

    String str2 = "";
    node = null;
    stack.push(null);
    stack.push(root2);
    while ((node = stack.pop()) != null) {
      str2 += '_' + node.val + '_';

      if (node.right != null) {
        stack.push(node.right);
      }
      if (node.left != null) {
        stack.push(node.left);
      }
    }

    if (str.contains(str2)) {
      return true;
    } else {
      return false;
    }
  }

树的构建

二叉树而言,可以通过数组的方式进行存放,首节点放在数组0号位置处,其左节点在1号位置处,其右节点在2号位置处。由此该index的映射关系为:

index_parent.left => 2* index_parent + 1;
index_parent.right=> 2* index_parent + 2;

构建思路,左节点和右节点分别构建,根节点的左节点就一直追溯其子节点,根节点的右节点一直追溯其子节点,由此,形成的是递归的结构。

代码如下:

注:这里数组中通过-1作为区分,读者可自行扩充。

public static TreeNode getTree(int[] node, int index) {

    if (index >= node.length)
      return null;
    TreeNode n = null;
    if (node[index] != -1) {
      n = new TreeNode(node[index]);
      n.left = getTree(node, index * 2 + 1);
      n.right = getTree(node, index * 2 + 2);
    }
    return n;
  }

完整代码

包括了资料中提供的代码,但是经过测试如下用例中是错误的,但是理论上说tree2应该是tree1的子结构才对。

import java.util.Stack;

public class HasSubtree {

  public static void main(String[] args) {

    TreeNode tree = getTree(new int[] { 8, 8, 7, 9, 2, -1, -1, -1, -1, 4, 7 }, 0);
    TreeNode tree2 = getTree(new int[] { 2, 4, 7 }, 0);
    boolean bool = HasSubtree(tree, tree2);
    System.out.println(bool);

    boolean bool2 = HasSubtree2(tree, tree2);
    System.out.println(bool2);
  }

  public static boolean HasSubtree2(TreeNode root1, TreeNode root2) {

    if (root2 == null)
      return false;
    String str = "";
    Stack<TreeNode> stack = new Stack<TreeNode>();
    stack.push(null);
    stack.push(root1);
    TreeNode node = null;
    while ((node = stack.pop()) != null) {
      str += '_' + node.val + '_';

      if (node.right != null) {
        stack.push(node.right);
      }
      if (node.left != null) {
        stack.push(node.left);
      }
    }

    String str2 = "";
    node = null;
    stack.push(null);
    stack.push(root2);
    while ((node = stack.pop()) != null) {
      str2 += '_' + node.val + '_';

      if (node.right != null) {
        stack.push(node.right);
      }
      if (node.left != null) {
        stack.push(node.left);
      }
    }

    if (str.contains(str2)) {
      return true;
    } else {
      return false;
    }
  }

  public static TreeNode getTree(int[] node, int index) {

    if (index >= node.length)
      return null;
    TreeNode n = null;
    if (node[index] != -1) {
      n = new TreeNode(node[index]);
      n.left = getTree(node, index * 2 + 1);
      n.right = getTree(node, index * 2 + 2);
    }
    return n;
  }

  public static boolean HasSubtree(TreeNode root1, TreeNode root2) {

    boolean result = false;
    if (root1 != null && root2 != null) {

      if (root1.val == root2.val) {
        result = isSubTree(root1, root2);
      }

      if (!result) {
        result = isSubTree(root1.left, root2);
      }

      if (!result) {
        result = isSubTree(root1.right, root2);
      }
    }

    return result;
  }

  private static boolean isSubTree(TreeNode root1, TreeNode root2) {

    if (root1 == null)
      return false;
    if (root2 == null)
      return true;
    if (root1.val != root2.val)
      return false;

    return isSubTree(root1.left, root2.left)
        && isSubTree(root1.right, root2.right);
  }

}

class TreeNode {
  int val = 0;
  TreeNode left = null;
  TreeNode right = null;

  public TreeNode(int val) {
    this.val = val;

  }

}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# 数据结构与算法--二叉树子结构  # 数据结构二叉树  # 使用C语言构建基本的二叉树数据结构  # Java中二叉树数据结构的实现示例  # python数据结构之二叉树的统计与转换实例  # python数据结构之二叉树的遍历实例  # python数据结构之二叉树的建立实例  # python数据结构树和二叉树简介  # 递归  # 可以通过  # 弹出  # 上说  # 二叉树  # 其子  # 的是  # 放在  # 遍历  # 数据结构  # 而成  # 希望能  # 谢谢大家  # 才对  # 主要是  # 组中  # 应该是  # 特殊符号  # 使用了  # 但是我 


相关文章: 简历在线制作网站免费版,如何创建个人简历?  购物网站制作公司有哪些,哪个购物网站比较好?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  如何在Windows虚拟主机上快速搭建网站?  MySQL查询结果复制到新表的方法(更新、插入)  如何使用Golang table-driven基准测试_多组数据测量函数效率  如何通过FTP空间快速搭建安全高效网站?  利用JavaScript实现拖拽改变元素大小  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  建站之星好吗?新手能否轻松上手建站?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  微信小程序 input输入框控件详解及实例(多种示例)  css网站制作参考文献有哪些,易聊怎么注册?  如何确保FTP站点访问权限与数据传输安全?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  建站主机选哪家性价比最高?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  如何高效完成独享虚拟主机建站?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  免费视频制作网站,更新又快又好的免费电影网站?  如何注册花生壳免费域名并搭建个人网站?  建站之星客服服务时间及联系方式如何?  免费网站制作appp,免费制作app哪个平台好?  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  建站之星2.7模板:企业网站建设与h5定制设计专题  网站制作壁纸教程视频,电脑壁纸网站?  ,怎么用自己头像做动态表情包?  制作电商网页,电商供应链怎么做?  建站之星安装后界面空白如何解决?  非常酷的网站设计制作软件,酷培ai教育官方网站?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  建站主机解析:虚拟主机配置与服务器选择指南  设计网站制作公司有哪些,制作网页教程?  如何快速登录WAP自助建站平台?  建站之星导航菜单设置与功能模块配置全攻略  如何在景安服务器上快速搭建个人网站?  建站之星伪静态规则如何正确配置?  如何通过虚拟主机快速完成网站搭建?  定制建站是什么?如何实现个性化需求?  重庆网站制作公司哪家好,重庆中考招生办官方网站?  建站主机是否属于云主机类型? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。