最近在温习树相关的知识,并且用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实现的更多相关文章

  1. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  2. 【转】java NIO 相关知识

    原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...

  3. Java 容器相关知识全面总结

    Java实用类库提供了一套相当完整的容器来帮助我们解决很多具体问题.因为我本身是一名Android开发者,包括我在内很多安卓开发,最拿手的就是ListView(RecycleView)+BaseAda ...

  4. [转]java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  5. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  6. HTML入门基础教程相关知识

    HTML入门基础教程 html是什么,什么是html通俗解答: html是hypertext markup language的缩写,即超文本标记语言.html是用于创建可从一个平台移植到另一平台的超文 ...

  7. listener监听器的相关知识

    从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...

  8. WEB相关知识和Tomcat服务器

    WEB相关知识 1.Internet上供外界访问的Web资源分为: 静态web资源:指web页面中供人们浏览的数据始终是不变的. 动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间 ...

  9. python实现单例模式的三种方式及相关知识解释

    python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...

随机推荐

  1. 【Springboot】Springboot整合Thymeleaf模板引擎

    Thymeleaf Thymeleaf是跟Velocity.FreeMarker类似的模板引擎,它可以完全替代JSP,相较与其他的模板引擎,它主要有以下几个特点: 1. Thymeleaf在有网络和无 ...

  2. 由于服务主机:DCOM服务进程占用过多CPU,导致系统卡死

    最近在使用电脑的时候,总是出现电脑死机,而且鼠标也是经常卡在那里不动了,开始以为是鼠标的问题,还换了个鼠标(飙泪中),这还是一个血的教训啊!!!之后打开任务管理器发现CPU占用已经达到100%,而且一 ...

  3. 02 入门 - ASP.NET MVC 5 概述

    目录索引:<ASP.NET MVC 5 高级编程>学习笔记 本篇内容: 一.One ASP.NET 二.新的Web项目体验 三.ASP.NET Identity 四.Bootstrap 模 ...

  4. Github 快速建库上传本地代码

    1 github.com网页端先建好一个空库 2 本地对这个库进行 git clone 3 向本地库中添加已完成文件 4 运行如下命令 git add . (注:别忘记后面的.,此操作是把Test文件 ...

  5. 在react中实现打印功能

    最近项目中,前端采用react+antd+dva的组合,已经完成了后头管理类系统产品的更新迭代工作. 今天有一个新需求,需要在后台管理系统中实现点击打印完成指定页面的打印功能. 之前也没接触过,只知道 ...

  6. Android视频录制从不入门到入门系列教程(二)————显示视频图像

    1.创建一个空的工程,注意声明下列权限: <uses-permission android:name="android.permission.CAMERA"/> < ...

  7. 使用Android服务,实现报警管理器和广播接收器

    介绍 几乎在所有平台上都有很多进程运行背景,它们被称为服务.可能在Android平台中有一些服务可以执行长时间运行的操作,这些操作在处理时不需要用户交互. 在本文中,借助预定义的Android警报服务 ...

  8. Jmeter使用JDBC请求简介

    1.现在oracle或mysql的jdbc然后放到jmeter的lib路径下 2.添加jdbc默认请求控件. 3.添加jdbc请求 4.发送 5.出现ORA-00911错误是由于sql语句错误,注意别 ...

  9. DataPipeline CTO陈肃:从ETL到ELT,AI时代数据集成的问题与解决方案

    引言:2018年7月25日,DataPipeline CTO陈肃在第一期公开课上作了题为<从ETL到ELT,AI时代数据集成的问题与解决方案>的分享,本文根据陈肃分享内容整理而成. 大家好 ...

  10. mssql server for docker on MacOs

    1. install 1.下载镜像 docker pull microsoft/mssql-server-linux 使用该命令就可以把数据库的docker镜像下载下来. 2.创建并运行容器 dock ...