树 相关知识总结以及Java实现
最近在温习树相关的知识,并且用java实现了一下树的遍历相关,先贴上代码供大家参考吧。
package tree_problems;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Queue;
import java.util.Stack;
public class TreeNodec<E> {
E value;
TreeNodec<E> left;
TreeNodec<E> right;
public TreeNodec(E x){value=x;}
private static <E> void forPreOrderRecursion(TreeNodec<E> T,ArrayList<E> result) { //静态方法不可以访问类上定义的泛型,如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
if(T!=null) {
result.add(T.value);
forPreOrderRecursion(T.left, result);
forPreOrderRecursion(T.right, result);
}
}
public static <E> ArrayList<E> preOrderRecursion(TreeNodec<E> T) {
ArrayList<E> result = new ArrayList<>();
forPreOrderRecursion(T, result);
return result;
}
private static <E> void forInOrderRecursion(TreeNodec<E> T,ArrayList<E> result) { //静态方法不可以访问类上定义的泛型,如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
if(T!=null) {
forInOrderRecursion(T.left, result);
result.add(T.value);
forInOrderRecursion(T.right, result);
}
}
public static <E> ArrayList<E> inOrderRecursion(TreeNodec<E> T) {
ArrayList<E> result = new ArrayList<>();
forInOrderRecursion(T, result);
return result;
}
private static <E> void forPostOrderRecursion(TreeNodec<E> T,ArrayList<E> result) { //静态方法不可以访问类上定义的泛型,如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
if(T!=null) {
forPostOrderRecursion(T.left, result);
forPostOrderRecursion(T.right, result);
result.add(T.value);
}
}
public static <E> ArrayList<E> postOrderRecursion(TreeNodec<E> T) {
ArrayList<E> result = new ArrayList<>();
forPostOrderRecursion(T, result);
return result;
}
//非递归前序遍历
public static <E> ArrayList<E> preOrder(TreeNodec<E> T){
Stack<TreeNodec> stack = new Stack<>();
ArrayList<E> result = new ArrayList<>();
TreeNodec<E> p =T; //工作指针
while(p!=null||!stack.empty()) { //NLR,先读N,后进栈L和R
if(p!=null) {
result.add(p.value);
stack.push(p);
p=p.left;
}
else {
p=stack.pop().right;
}
}
return result;
}
public static <E> ArrayList<E> inOrder(TreeNodec<E> T){
Stack<TreeNodec> stack = new Stack<>();
ArrayList<E> result = new ArrayList<>();
TreeNodec<E> p =T; //工作指针
while(p!=null||!stack.empty()) { //LNR,先进栈L,再读,最后再进栈R
if(p!=null) {
stack.push(p);
p=p.left;
}
else {
p=stack.pop();
result.add(p.value);
p=p.right;
}
}
return result;
}
public static <E> ArrayList<E> postOrder(TreeNodec<E> T){//LRN和NRL结果倒过来一样,NRL和NLR又有什么区别呢……其实就是前序遍历啊……
Stack<TreeNodec> stack = new Stack<>();
ArrayList<E> result = new ArrayList<>();
TreeNodec<E> p =T; //工作指针
while(p!=null||!stack.empty()) {
if(p!=null) {
result.add(0,p.value);
stack.push(p);
p=p.right;
}
else {
p=stack.pop().left;
}
}
return result;
}
public static <E> ArrayList<E> postOrdersb(TreeNodec<E> T){//傻了,LRN和NRL结果倒过来一样,NRL和NLR又有什么区别呢……其实就是前序遍历啊……
Stack<TreeNodec> stack = new Stack<>();
Stack<E> values = new Stack<>();
ArrayList<E> result = new ArrayList<>();
TreeNodec<E> p =T; //工作指针
while(p!=null||!stack.empty()) { //LRN,先进栈(倒序NRL进栈),最后再读,用栈1负责顺序,用栈2负责读结果(如果用自己手动的栈可以将两个栈合并为1个)
if(p!=null) {
stack.push(p);
values.push(p.value);
p=p.right;
}
else {
p=stack.pop();
p=p.left;
}
}
while(!values.empty()) {
result.add(values.pop());
}
return result;
}
public static <E> ArrayList<E> levelTraverse(TreeNodec<E> T){
ArrayList<E> result = new ArrayList<>();
Queue<TreeNodec<E>> queue = new ArrayDeque<>();
queue.add(T);
TreeNodec<E> p = T;
while(!queue.isEmpty()) {
p = queue.remove();
result.add(p.value);
if(p.left!=null) queue.add(p.left);
if(p.right!=null) queue.add(p.right);
}
return result;
}
public static void main(String[] args) {
TreeNodec<Integer> T = new TreeNodec(1);
T.left = new TreeNodec(2);T.right = new TreeNodec(3);
T.left.right = new TreeNodec(4);T.left.right.left = new TreeNodec(6);
T.right.right = new TreeNodec(5);
ArrayList<Integer> preorder = TreeNodec.preOrderRecursion(T);
System.out.println(preorder);
ArrayList<Integer> inorder = TreeNodec.inOrderRecursion(T);
System.out.println(inorder);
ArrayList<Integer> postorder = TreeNodec.postOrderRecursion(T);
System.out.println(postorder);
ArrayList<Integer> prorder = TreeNodec.preOrder(T);
System.out.println(prorder);
ArrayList<Integer> iorder = TreeNodec.inOrder(T);
System.out.println(iorder);
ArrayList<Integer> porder = TreeNodec.postOrder(T);
System.out.println(porder);
ArrayList<Integer> levelTraversal = TreeNodec.levelTraverse(T);
System.out.println(levelTraversal);
}
}
树 相关知识总结以及Java实现的更多相关文章
- java中的字符串相关知识整理
字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...
- 【转】java NIO 相关知识
原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...
- Java 容器相关知识全面总结
Java实用类库提供了一套相当完整的容器来帮助我们解决很多具体问题.因为我本身是一名Android开发者,包括我在内很多安卓开发,最拿手的就是ListView(RecycleView)+BaseAda ...
- [转]java中的字符串相关知识整理
字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...
- 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸
类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...
- HTML入门基础教程相关知识
HTML入门基础教程 html是什么,什么是html通俗解答: html是hypertext markup language的缩写,即超文本标记语言.html是用于创建可从一个平台移植到另一平台的超文 ...
- listener监听器的相关知识
从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...
- WEB相关知识和Tomcat服务器
WEB相关知识 1.Internet上供外界访问的Web资源分为: 静态web资源:指web页面中供人们浏览的数据始终是不变的. 动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间 ...
- python实现单例模式的三种方式及相关知识解释
python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...
随机推荐
- [Vue] vue2.0
vue实例 所有的 Vue 组件都是 Vue 实例,并且接受相同的选项对象 当一个 Vue 实例被创建时,它将 data 对象中的所有的属性加入到 Vue 的响应式系统中.当这些属性的值发生改变时,视 ...
- 用tornado实现图片标记
背景介绍 在文章Keras入门(四)之利用CNN模型轻松破解网站验证码中,其中的验证码图片标记是采用tornado实现的网页实现的.本文将会讲述如何利用tornado来实现图片标记. 我们的示 ...
- asp.net mvc 简单项目框架的搭建过程(一)对Bll层和Dal层进行充分解耦
学习asp.net 已经有近三个月的时间了,在asp.net mvc上花的时间最多,但个人真是有些菜,不得不说,asp.net mvc的水真的还是蛮深的.目前在公司实习,也见过公司几个项目的代码了.对 ...
- 论AOP面向切面编程思想
原创: eleven 原文:https://mp.weixin.qq.com/s/8klfhCkagOxlF1R0qfZsgg [前言] AOP(Aspect-Oriented Programming ...
- 简述在ADO中使用接口的抽象数据提供程序以及ADO.NET数据提供程序工厂模型
如何在ADO中使用接口的抽象数据提供程序 在cofig中 appSettings下,配置数据连接类型 <appSettings> <!--这个键值映射到枚举值中的某个值--> ...
- PHP的简单跳转提示的实现
在PHP开发中,尤其是MVC框架或者项目中,会碰到很多跳转情况,比如:登录成功或失败后的跳转等等. 以下以MVC框架开发中为基础,示例讲解: 在基础控制器类中:Conrtoller.class.php ...
- 我的世界 ParaCraft 结合开源地图 OpenStreetMap 生成3D校园的方法简介
我的世界ParaCraft结合开源地图OpenStreetMap生成3D校园的方法简介 版本1.0 日期2019.2.3 作者Ray (82735589@qq.com) www.TimeGIS.com ...
- Nano Server速记
入门参考https://docs.microsoft.com/zh-cn/windows-server/get-started/nano-server-quick-start 1.创建VHD Impo ...
- 大华门禁SDK二次开发(一)-技术沟通
项目中需要能够查询门禁信号和控制门禁设备,因此需要基于大华门禁SDK进行二次开发,开发语言C#.门禁开发中遇到了一些问题,经过与大华技术的邮件沟通也一一解决.做这个开发的时候,发现网上的资料比较少,想 ...
- (二) Keras 非线性回归
视频学习来源 https://www.bilibili.com/video/av40787141?from=search&seid=17003307842787199553 笔记 Keras ...