1、二叉树节点类

public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null; public TreeNode(int val) {
this.val = val;
} public TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
} //---------------------------- public int getVal() {
return val;
} public void setVal(int val) {
this.val = val;
} public TreeNode getLeft() {
return left;
} public void setLeft(TreeNode left) {
this.left = left;
} public TreeNode getRight() {
return right;
} public void setRight(TreeNode right) {
this.right = right;
}
}

2、二叉树打印类

public class PrintTree {
public void printNode(TreeNode node){
System.out.print(node.getVal());
} //先序遍历
public void theFirstTraversal(TreeNode root) {
printNode(root);
if (root.getLeft() != null) { //使用递归进行遍历左孩子
theFirstTraversal(root.getLeft());
}
if (root.getRight() != null) { //递归遍历右孩子
theFirstTraversal(root.getRight());
}
} //中序遍历
public void theInOrderTraversal(TreeNode root) {
if (root.getLeft() != null) {
theInOrderTraversal(root.getLeft());
}
printNode(root);
if (root.getRight() != null) {
theInOrderTraversal(root.getRight());
}
} //后序遍历
public void thePostOrderTraversal(TreeNode root) {
if (root.getLeft() != null) {
thePostOrderTraversal(root.getLeft());
}
if(root.getRight() != null) {
thePostOrderTraversal(root.getRight());
}
printNode(root);
} }

3、判断二叉树是否包含另一棵树的类

public class HasSubtree {
public boolean hasSubtree(TreeNode root1, TreeNode root2) { boolean result = false;
//当Tree1和Tree2都不为零的时候,才进行比较。否则直接返回false
if (root2 != null && root1 != null) {
//如果找到了对应Tree2的根节点的点
if (root1.val == root2.val) {
//以这个根节点为为起点判断是否包含Tree2
result = doesTree1HaveTree2(root1, root2);
}
//如果找不到,那么就再去root的左叶子当作起点,去判断时候包含Tree2
if (!result) {
result = hasSubtree(root1.left, root2);
} //如果还找不到,那么就再去root的右儿子当作起点,去判断时候包含Tree2
if (!result) {
result = hasSubtree(root1.right, root2);
}
}
//返回结果
return result;
} public static boolean doesTree1HaveTree2(TreeNode node1, TreeNode node2) {
//如果Tree2已经遍历完了都能对应的上,返回true
if (node2 == null) {
return true;
}
//如果Tree2还没有遍历完,Tree1却遍历完了。返回false
if (node1 == null) {
return false;
}
//如果其中有一个点没有对应上,返回false
if (node1.val != node2.val) {
return false;
} //如果根节点对应的上,那么就分别去子节点里面匹配
return doesTree1HaveTree2(node1.left, node2.left) && doesTree1HaveTree2(node1.right, node2.right);
}
}

4、测试类

public class TestMain {
public static void main(String[] args) {
//创建二叉树tree1
TreeNode root1=new TreeNode(0);
TreeNode node11=new TreeNode(1);
TreeNode node12=new TreeNode(2);
TreeNode node13=new TreeNode(3);
TreeNode node14=new TreeNode(4);
TreeNode node15=new TreeNode(5);
TreeNode node16=new TreeNode(6); root1.setLeft(node11);
root1.setRight(node12);
node11.setLeft(node13);
node11.setRight(node14);
node12.setLeft(node15);
node12.setRight(node16); //采用前序遍历方式打印二叉树
PrintTree p=new PrintTree();
p.theFirstTraversal(root1);
System.out.println(); //创建二叉树tree2
TreeNode root2=new TreeNode(1);
TreeNode node21=new TreeNode(3);
TreeNode node22=new TreeNode(4); root2.setLeft(node21);
root2.setRight(node22); //采用前序遍历方式打印二叉树
PrintTree p2=new PrintTree();
p2.theFirstTraversal(root2);
System.out.println(); //判断tree2是否为tree1的子树
HasSubtree h=new HasSubtree();
Boolean b=h.hasSubtree(root1,root2);
System.out.println("是否包含:"+b); }
}

剑指offer十七姊妹篇之二叉树的创建、遍历、判断子二叉树的更多相关文章

  1. C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解

    剑指offer  面试题23:从上往下打印二叉树 参与人数:4853  时间限制:1秒  空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...

  2. 剑指 Offer 48. 最长不含重复字符的子字符串 + 动态规划 + 哈希表 + 双指针 + 滑动窗口

    剑指 Offer 48. 最长不含重复字符的子字符串 Offer_48 题目详情 解法分析 解法一:动态规划+哈希表 package com.walegarrett.offer; /** * @Aut ...

  3. 【Java】 剑指offer(48) 最长不含重复字符的子字符串

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字 ...

  4. 剑指offer二十二之从上往下打印二叉树

    一.题目 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 二.思路 二叉树的层次遍历,可以借助队列实现.具体思路详见注释. 三.代码 import java.util.ArrayList; i ...

  5. 剑指Offer 通过中序和先序遍历重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  6. 剑指offer面试题23:从上到下打印二叉树(树的层序遍历)

    题目:从上往下打印出二叉树的每个节点,同一层的结点按照从左往右的顺序打印. 解题思路:二叉树的层序遍历,在打印一个节点的时候,要把他的子节点保存起来打印第一层要把第二层的节点保存起来, 打印第二层要把 ...

  7. 剑指Offer的学习笔记(C#篇)-- 平衡二叉树(二叉树后序遍历递归详解版)

    题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 一 . 题目分析 首先要理解一个概念:什么是平衡二叉树,如果某二叉树中任意的左右子树深度相差不超过1,那么他就是一颗平衡二叉树.如下图: 所以 ...

  8. 剑指offer:序列化二叉(前序遍历+层次)

    1. 题目描述 /** 请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存. 序列 ...

  9. 剑指offer 树的基本操作:四种遍历方式

    前序遍历 递归版 编程思想 即借助系统栈,效率较低.二叉树的前序遍历规则:1. 访问根结点: 2. 遍历左子树: 3. 遍历右子树 编程实现 //树的定义 struct TreeNode { int ...

随机推荐

  1. boost--ref

    1.ref简介 reference_wrapper包含在ref库中,它是引用包装器类型,即其内部包装了引用. 成员函数get().get_pointer()分别可以获得被包装的引用和其指针.使用需要包 ...

  2. 分区表主键不包含分区键报错ERROR 1105 (HY000)

    ERROR 1105 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function MySQ ...

  3. 10-padding(内边距)

    padding padding:就是内边距的意思,它是边框到内容之间的距离 另外padding的区域是有背景颜色的.并且背景颜色和内容的颜色一样.也就是说background-color这个属性将填充 ...

  4. linux 环境安装及学习

    一.Httpd Linux(Apache)Httpd服务器安装,启动及httpd.conf配置详解   https://blog.51cto.com/itwish/2160492 httpd-2.4. ...

  5. hdu 5089 使做对k-1题最大概率的选题方案

    http://acm.hdu.edu.cn/showproblem.php?pid=5089 给出N道难度递增的题目,难度用可能做出的百分比表示,选出K道题目使得做出K-1道题目的概率最大. 选k题的 ...

  6. JVM可支持的最大线程数

    转微博,因为他也是转载  不知道原出处 一.认识问题: 首先我们通过下面这个 测试程序 来认识这个问题:运行的环境 (有必要说明一下,不同环境会有不同的结果):32位 Windows XP,Sun J ...

  7. SRM472

    这次是rng_58出的题目,思维难度还是相当大的的..很值得一做. 250pt: 题意:盒子里有n 个 potatoes,甲乙两个人,每次只能拿4的幂次方数(1,4,16...),最后不能拿的输.求谁 ...

  8. ASP.NET Web API 框架研究 Controller创建过程与消息处理管道

    现在我们从代码角度来看下,从消息处理管道末尾是怎么创建出Controller实例的.消息处理管道末端是一个叫HttpRoutingDispatcher的处理器,其内部完成路由后 ,会把消息派送给其内部 ...

  9. Python自动化开发 - 网络编程

    本节内容 1.客户端/服务器架构 2.OSI七层 3.socket层 4.socket是什么 5.套接字发展史及分类 6.套接字工作流程 一.客户端/服务器架构 即Client/Server架构,包括 ...

  10. PowerDesigner常用功能介绍

    PowerDesigner常用功能:1:把SQL脚步导入PowerDesigner打开powerdesigner,选择File --> Reverse Engineer --> Datab ...