树 相关知识总结以及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 ...
随机推荐
- 1.3创建项目「深入浅出ASP.NET Core系列」
控制台创建项目 dotnet new --help 使用控制台采集项目,务必要熟练使用命令,--help是命令帮助的指明灯,在你无法google的时候,可以离线状态最快的帮助到你. 根据模板名称,我们 ...
- c# Lambda操作类封装
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; us ...
- 回顾曾经的自己,献给java初学者的建议
要不惜代价投资自己,任何对自己的投资都是值得的 要多学习数据结构, 习惯看源码! 一份知识经过n个人的传递早已经不成样子了 遇到问题不要直接百度,百度上那些花里胡哨的东西有用的很少,对症下药才是王道, ...
- JAVA设计模式——简单工厂
工厂模式分为三种:简单工厂模式,工厂方法模式,抽象工厂模式.我看有的书上和有的文章里是分为两种,没有简单工厂. 工厂模式主要的作用是:一个对象在实例化的时候可以选择多个类,在实例化的时候根据一些业务规 ...
- 解决html代码文本复制问题,js技术
实例代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <scr ...
- App隐私条款
欢迎光临本app,请您仔细阅读以下条款,如果您对本协议的任何条款表示异议,您可以选择不使用本app:进入本app则意味着您将同意遵守本协议下全部规定,并完全服从于app开发者的统一管理. 第一章 总则 ...
- weblogic 安全漏洞 CVE-2017-5638
关于安全漏洞 CVE-2017-5638 的 Weblogic Server 防护建议 关于Weblogic Server如何防护防止近期爆出的Struts 2远程代码执行安全漏洞,为您提供以下内容参 ...
- 生鲜配送管理系统_升鲜宝供应链系统V2.0 设计思想及主要模块,欢迎大家批评指点。
前言: 经过这几年的开发,升鲜宝生鲜供应链系统管理软件,终于完成C/S与B/S二个版本的开发,先主要介绍B/S版本的功能,C/S版本的功能更加完善. 升鲜宝供应链系统主要由以下几个主要端组成: ...
- Openlayers系列(一)关于地图投影相关错误的解决方案
背景 近期开发以MongoDB为基础的分布式地理数据管理平台系统,被要求做一个简单的demo给客户进行演示.于是笔者便打算向数据库中存储一部分瓦片数据,写一个简单的存取服务器,使用Openlayers ...
- oppo6.0系统设备(亲测有效)激活xposed框架的流程
对于喜欢研究手机的伙伴来说,常常会用到xposed框架以及种类繁多功能强大的模块,对于5.0以下的系统版本,只要手机能获得Root权限,安装和激活xposed框架是异常简易的,但随着系统版本的不断升级 ...