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

需求
输入两棵二叉树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数据结构树和二叉树简介
# 递归
# 可以通过
# 弹出
# 上说
# 二叉树
# 其子
# 的是
# 放在
# 遍历
# 数据结构
# 而成
# 希望能
# 谢谢大家
# 才对
# 主要是
# 组中
# 应该是
# 特殊符号
# 使用了
# 但是我
相关文章:
潮流网站制作头像软件下载,适合母子的网名有哪些?
太原网站制作公司有哪些,网约车营运证查询官网?
怎么将XML数据可视化 D3.js加载XML
如何在服务器上三步完成建站并提升流量?
建站之星安装需要哪些步骤及注意事项?
TestNG的testng.xml配置文件怎么写
视频网站app制作软件,有什么好的视频聊天网站或者软件?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
安徽网站建设与外贸建站服务专业定制方案
如何通过IIS搭建网站并配置访问权限?
C#怎么使用委托和事件 C# delegate与event编程方法
建站VPS选购需注意哪些关键参数?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
已有域名和空间如何快速搭建网站?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
建站之星免费模板:自助建站系统与智能响应式一键生成
如何选择高效可靠的多用户建站源码资源?
怀化网站制作公司,怀化新生儿上户网上办理流程?
公司网站设计制作厂家,怎么创建自己的一个网站?
如何快速搭建安全的FTP站点?
如何选择域名并搭建高效网站?
建站之星上传入口如何快速找到?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
如何访问已购建站主机并解决登录问题?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
装修招标网站设计制作流程,装修招标流程?
做企业网站制作流程,企业网站制作基本流程有哪些?
网站微信制作软件,如何制作微信链接?
阿里云网站制作公司,阿里云快速搭建网站好用吗?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
C++时间戳转换成日期时间的步骤和示例代码
如何高效生成建站之星成品网站源码?
网站代码制作软件有哪些,如何生成自己网站的代码?
一键网站制作软件,义乌购一件代发流程?
如何通过PHP快速构建高效问答网站功能?
如何在Tomcat中配置并部署网站项目?
建站之星伪静态规则如何正确配置?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
XML的“混合内容”是什么 怎么用DTD或XSD定义
黑客入侵网站服务器的常见手法有哪些?
jQuery 常见小例汇总
如何通过FTP服务器快速搭建网站?
如何在香港免费服务器上快速搭建网站?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
如何在Golang中引入测试模块_Golang测试包导入与使用实践
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
*请认真填写需求信息,我们会在24小时内与您取得联系。