近期复习数据结构中的二叉树的相关问题,在这里整理一下

这里包含:

1、二叉树的先序创建

2、二叉树的递归先序遍历

3、二叉树的非递归先序遍历

4、二叉树的递归中序遍历

5、二叉树的非递归中序遍历

6、二叉树的递归后序遍历

7、二叉树的非递归后序遍历

8、二叉树的层次遍历

这里感谢博客http://blog.csdn.net/skylinesky/article/details/6611442的指导

/**二叉树的结点定义*/
class Node<T>{
private T value;
private Node<T> left;
private Node<T> right; public Node(){
}
public Node(Node<T> left, Node<T> right, T value){
this.left = left;
this.right = right;
this.value = value;
}
public Node(T value){
this(null, null, value);
} public Node<T> getLeft(){
return this.left;
}
public void setLeft(Node<T> left){
this.left = left;
}
public Node<T> getRight(){
return this.right;
}
public void setRight(Node<T> right){
this.right = right;
}
public T getValue(){
return this.value;
}
public void setValue(T value){
this.value = value;
}
}
import java.io.File;
import java.io.FileNotFoundException;
import java.util.LinkedList;
import java.util.Scanner; /**
* 二叉树的定义:或为空,或仅仅有根节点,或有左子树和右子树(5种基本形态)
* 二叉树性质:
* 1、在二叉树的第i层上至多有2^(i-1)个结点(i>=1)
* 2、深度为k的二叉树至多有2^(k) - 1个结点(k>=1)
* 3、对于不论什么一颗二叉树,假设其终端结点数为n,度数为2的结点数为m。则n = m + 1
* 4、具有n个结点的全然二叉树的深度为k = floor(log2(n)) + 1
* 5、在含有n个结点的二叉链表中有n+1个空链域
*
* @author 小菜鸟
*创建时间:2014-08-10
*/ public class BinaryTree<T> { /**二叉树的根节点*/
private Node<T> root; public BinaryTree(){}
public BinaryTree(Node<T> root){
this.root = root;
} /**先序遍历创建二叉树*/
/**input.txt: - + a # # * # # / e # # f # #
* # 代表空结点
*/
public void createBiTree(){
Scanner scn = null; try {
scn = new Scanner(new File("input.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} this.root = createBiTree(root, scn);
}
private Node<T> createBiTree(Node<T> node, Scanner scn) { String temp = scn.next();
if(temp.trim().equals("#")){
return null;
}
else{
node = new Node<T>((T)temp);
node.setLeft(createBiTree(node.getLeft(), scn));
node.setRight(createBiTree(node.getRight(), scn));
return node;
}
} /**先序递归遍历二叉树*/
public void preOrderTraverse(){
preOrderTraverse(root);
}
private void preOrderTraverse(Node<T> node) {
if(node != null){
System.out.println(node.getValue());
preOrderTraverse(node.getLeft());
preOrderTraverse(node.getRight());
}
} /**先序非递归遍历二叉树*/
public void nrPreOrderTraverse(){
Stack<Node<T>> stack = new Stack<Node<T>>();
Node<T> node = root;
while(node != null || !stack.isEmpty()){
while(node != null){
System.out.println(node.getValue());
stack.push(node);
node = node.getLeft();
}
node = stack.pop();
node = node.getRight();
}
} /**中序递归遍历二叉树*/
public void inOrderTraverse(){
inOrderTraverse(root);
}
private void inOrderTraverse(Node<T> node) {
if(node != null){
inOrderTraverse(node.getLeft());
System.out.println(node.getValue());
inOrderTraverse(node.getRight());
}
} /**中序非递归遍历二叉树*/
public void nrInOrderTraverse(){
Stack<Node<T>> stack = new Stack<Node<T>>();
Node<T> node = root;
while(node != null || !stack.isEmpty()){
while(node != null){
stack.push(node);
node = node.getLeft();
}
node = stack.pop();
System.out.println(node.getValue());
node = node.getRight();
}
} /**后序递归遍历二叉树*/
public void postOrderTraverse(){
postOrderTraverse(root);
}
private void postOrderTraverse(Node<T> node) {
if(node != null){
postOrderTraverse(node.getLeft());
postOrderTraverse(node.getRight());
System.out.println(node.getValue());
}
} /**后序非递归遍历二叉树*/
public void nrPostOrderTraverse(){
Stack<Node<T>> stack = new Stack<Node<T>>();
Node<T> node = root;
Node<T> preNode = null; //记录之前遍历的右结点
while(node != null || !stack.isEmpty()){
while(node != null){
stack.push(node);
node = node.getLeft();
}
node = stack.getTop(); /**假设右结点为空,或者右结点之前遍历过。打印根结点*/
if(node.getRight() == null || node.getRight() == preNode){
System.out.println(node.getValue());
node = stack.pop();
preNode = node;
node = null;
}
else{
node = node.getRight();
}
}
} /**层次遍历二叉树*/
public void levelTraverse(){
levelTraverse(root);
}
private void levelTraverse(Node<T> node) {
Queue<Node<T>> queue = new Queue<Node<T>>();
queue.push(node);
while(!queue.isEmpty()){
node = queue.pop();
if(node != null){
System.out.println(node.getValue());
queue.push(node.getLeft());
queue.push(node.getRight());
}
}
} public static void main(String[] args){
BinaryTree<String> bt = new BinaryTree<String>();
bt.createBiTree();
//bt.preOrderTraverse();
//bt.inOrderTraverse();
//bt.postOrderTraverse();
//bt.nrPreOrderTraverse();
//bt.nrInOrderTraverse();
//bt.nrPostOrderTraverse();
bt.levelTraverse();
}
}

【注:当中关于栈和队列的定义请參考还有一篇博文】

Java实现栈和队列的定义:http://blog.csdn.net/junwei_yu/article/details/38470825

Java实现二叉树的创建、递归/非递归遍历的更多相关文章

  1. 【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归)

    一.搜索二叉树的插入,查找,删除 简单说说搜索二叉树概念: 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右 ...

  2. 二叉树的先序、中序以及后序遍历(递归 && 非递归)

    树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二 ...

  3. 树的广度优先遍历和深度优先遍历(递归非递归、Java实现)

    在编程生活中,我们总会遇见树性结构,这几天刚好需要对树形结构操作,就记录下自己的操作方式以及过程.现在假设有一颗这样树,(是不是二叉树都没关系,原理都是一样的) 1.广度优先遍历 英文缩写为BFS即B ...

  4. Reverse Linked List 递归非递归实现

    单链表反转--递归非递归实现 Java接口: ListNode reverseList(ListNode head) 非递归的实现 有2种,参考 头结点插入法 就地反转 递归的实现 1) Divide ...

  5. java操作文件的创建、删除、遍历

    java操作文件的创建.删除.遍历: package test; import java.io.File; import java.io.IOException; import java.util.A ...

  6. c++实现二叉树层序、前序创建二叉树,递归非递归实现二叉树遍历

    #include <iostream> #include <cstdio> #include <stdio.h> #include <string> # ...

  7. 二叉树的递归,非递归遍历(java)

    import java.util.Stack; import java.util.HashMap; public class BinTree { private char date; private ...

  8. c++实现二叉树的非递归创建以及非递归先序、中序、后序遍历

    二叉树的创建 思路:数组中从上到下依次放着二叉树中的元素,使用递归很容易实现,那么这里使用容器来存放之前的状态实现循环创建二叉树. TreeNode* createTree(int *arr, int ...

  9. 二叉树的递归,非递归遍历(C++)

    二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...

随机推荐

  1. VUE使用中踩过的坑

    前言 vue如今可谓是一匹黑马,github star数已居第一位!前端开发对于vue的使用已经越来越多,它的优点就不做介绍了,本篇是我对vue使用过程中以及对一些社区朋友提问我的问题中做的一些总结, ...

  2. [luogu] P4551 最长异或路径(贪心)

    P4551 最长异或路径 题目描述 给定一棵\(n\)个点的带权树,结点下标从\(1\)开始到\(N\).寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或 ...

  3. Java并发和多线程2:3种方式实现数组求和

    本篇演示3个数组求和的例子. 例子1:单线程例子2:多线程,同步求和(如果没有计算完成,会阻塞)例子3:多线程,异步求和(先累加已经完成的计算结果) 例子1-代码 package cn.fansuni ...

  4. SpringBoot+Maven聚合多项目打包成jar

    已我最近自己在玩的一个DEMO为例 taosir为pom.xml,其他子项目均为其modules,且为jar项目 eureka为注册中心.workflow为提供者.entrance为调用方 entra ...

  5. 【【henuacm2016级暑期训练】动态规划专题 L】Civilization

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 给一个森林. 就是由很多棵树组成.. 然后会询问你其中一棵树的最长链. 初始状态的最长链可以用两遍dfs分别找最长路得到. 然后要求 ...

  6. Android之——自己定义TextView

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47082241 在这一篇博文中,将向大家介绍怎样以最简单的方式,来自己定义Andro ...

  7. Oracle 实现 mysql 更新 update limit

    oracle给人的感觉非常落后.使用非常不方便,Toad 这个软件又笨又迟钝.pl/sql更是,90年代的界面风格,速度还卡得要死.并且oracle不支持limit .by default7#zbph ...

  8. 《Head First 设计模式》学习笔记——适配器模式 + 外观模式

    在ADO.NET中.对于我们从数据库中取出的数据都要放到一个DataSet中,无论你是Access的数据库,还是SQL的数据库,或者是Oracle的数据库都要放到DataSet中..NET中并没有提供 ...

  9. httpClient模拟登陆校内某系统

    package com.huowolf; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpE ...

  10. bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)

    3295: [Cqoi2011]动态逆序对 题目:传送门 题解: 刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波 还是太弱了...想到了要做两次cdq...然后伏地 ...