剑指offer十七姊妹篇之二叉树的创建、遍历、判断子二叉树
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十七姊妹篇之二叉树的创建、遍历、判断子二叉树的更多相关文章
- C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
剑指offer 面试题23:从上往下打印二叉树 参与人数:4853 时间限制:1秒 空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...
- 剑指 Offer 48. 最长不含重复字符的子字符串 + 动态规划 + 哈希表 + 双指针 + 滑动窗口
剑指 Offer 48. 最长不含重复字符的子字符串 Offer_48 题目详情 解法分析 解法一:动态规划+哈希表 package com.walegarrett.offer; /** * @Aut ...
- 【Java】 剑指offer(48) 最长不含重复字符的子字符串
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字 ...
- 剑指offer二十二之从上往下打印二叉树
一.题目 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 二.思路 二叉树的层次遍历,可以借助队列实现.具体思路详见注释. 三.代码 import java.util.ArrayList; i ...
- 剑指Offer 通过中序和先序遍历重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 剑指offer面试题23:从上到下打印二叉树(树的层序遍历)
题目:从上往下打印出二叉树的每个节点,同一层的结点按照从左往右的顺序打印. 解题思路:二叉树的层序遍历,在打印一个节点的时候,要把他的子节点保存起来打印第一层要把第二层的节点保存起来, 打印第二层要把 ...
- 剑指Offer的学习笔记(C#篇)-- 平衡二叉树(二叉树后序遍历递归详解版)
题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 一 . 题目分析 首先要理解一个概念:什么是平衡二叉树,如果某二叉树中任意的左右子树深度相差不超过1,那么他就是一颗平衡二叉树.如下图: 所以 ...
- 剑指offer:序列化二叉(前序遍历+层次)
1. 题目描述 /** 请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存. 序列 ...
- 剑指offer 树的基本操作:四种遍历方式
前序遍历 递归版 编程思想 即借助系统栈,效率较低.二叉树的前序遍历规则:1. 访问根结点: 2. 遍历左子树: 3. 遍历右子树 编程实现 //树的定义 struct TreeNode { int ...
随机推荐
- High-radix routers
The idea is to reduce H (hops), by adding explicit links between physically distant routers, thus re ...
- C++STL容器重点
string 查找和替换 vector 删除
- C语言三种方法调用数组
#include <stdio.h> /********************************* * 方法1: 第一维的长度可以不指定 * * 但必须指定第二维的长度 * *** ...
- Linux系统各发行版镜像下载(借阅)
Linux各个版本资源下载 Linux系统各发行版镜像下载(持续更新) == Linux系统各发行版镜像下载(2014年10月更新),如果直接下载不了,请使用迅雷下载.并且注意,我的下载地址,在 迅 ...
- js判断 pc 手机 浏览器
<script> var result = window.matchMedia('(max-width: 700px)'); var browser={ versions:function ...
- AngularJS实战之ngAnimate插件实现轮播
第一步:引入angular-animate.js 第二步:注入ngAnimate var lxApp = angular.module("lxApp", [ 'ngAnimate' ...
- Linux远程批量工具mooon_ssh和mooon_upload使用示例
目录 目录 1 1. 前言 1 2. 批量执行命令工具:mooon_ssh 2 3. 批量上传文件工具:mooon_upload 2 4. 使用示例 3 4.1. 使用示例1:上传/etc/hosts ...
- cJSON精度丢失问题
问题复现步骤:1) 输入字符串:{ "V":0.12345678}2) 字符串转成cJSON对象3) 调用cJSON_Print将cJSON对象再转成字符串4) 再将字符串转 ...
- kafka_shell操作
单机版 开启进程: ./bin/kafka-server-start.sh config/server.properties 查看topic列表: ./bin/kafka-topics.sh --li ...
- js-图片轮播
<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content=&q ...