全网整合营销服务商

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

免费咨询热线: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数据结构树和二叉树简介  # 递归  # 可以通过  # 弹出  # 上说  # 二叉树  # 其子  # 的是  # 放在  # 遍历  # 数据结构  # 而成  # 希望能  # 谢谢大家  # 才对  # 主要是  # 组中  # 应该是  # 特殊符号  # 使用了  # 但是我 


相关文章: 盐城做公司网站,江苏电子版退休证办理流程?  建站之星安装后如何自定义网站颜色与字体?  如何在IIS中新建站点并解决端口绑定冲突?  自助网站制作软件,个人如何自助建网站?  西安大型网站制作公司,西安招聘网站最好的是哪个?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  建站之星展会模板:智能建站与自助搭建高效解决方案  Python lxml的etree和ElementTree有什么区别  威客平台建站流程解析:高效搭建教程与设计优化方案  南平网站制作公司,2025年南平市事业单位报名时间?  实例解析Array和String方法  *服务器网站为何频现安全漏洞?  如何做网站制作流程,*游戏网站怎么搭建?  如何在新浪SAE免费搭建个人博客?  深圳网站制作平台,深圳市做网站好的公司有哪些?  html制作网站的步骤有哪些,iapp如何添加网页?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  制作网站公司那家好,网络公司是做什么的?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  做企业网站制作流程,企业网站制作基本流程有哪些?  制作证书网站有哪些,全国城建培训中心证书查询官网?  存储型VPS适合搭建中小型网站吗?  电商平台网站制作流程,电商网站如何制作?  建站之星微信建站一键生成小程序+多端营销系统  ,石家庄四十八中学官网?  建站主机类型有哪些?如何正确选型  小型网站建站如何选择虚拟主机?  如何零成本快速生成个人自助网站?  成都网站制作报价公司,成都工业用气开户费用?  如何在Ubuntu系统下快速搭建WordPress个人网站?  网站制作的步骤包括,正确网址格式怎么写?  定制建站哪家更专业可靠?推荐榜单揭晓  如何撰写建站申请书?关键要点有哪些?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  如何通过虚拟主机快速完成网站搭建?  Python文件管理规范_工程实践说明【指导】  如何通过宝塔面板实现本地网站访问?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  网站制作公司排行榜,四大门户网站排名?  建站主机选虚拟主机还是云服务器更好?  建站之星免费模板:自助建站系统与智能响应式一键生成  寿县云建站:智能SEO优化与多行业模板快速上线指南  大同网页,大同瑞慈医院官网?  如何通过服务器快速搭建网站?完整步骤解析  学校建站服务器如何选型才能满足性能需求?  建站之星如何取消后台验证码生成?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  如何通过VPS建站无需域名直接访问? 

您的项目需求

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