java 二叉树的各种遍历
先序中序后序,递归与非递归,默认构造的排序二叉树
package Tree;import java.util.Stack;public class BinaryTree
{class Node{int value;Node LeftChild;Node RightChild;Node(int value) {this.value = value;LeftChild = null;RightChild = null;}}public Node root;//根节点Stack<Node>s = new Stack<>();BinaryTree() //这是构造方法,不能修改和定义成 public{root = null;}public void Binary(int array[])//what the fuck?{for(int i: array){insert(i);}}public void insert(int value){root = insert(root,value);}public Node insert(Node node,int value){if(node == null)node = new Node(value);else{if(value<=node.value)node.LeftChild = insert(node.LeftChild,value);elsenode.RightChild=insert(node.RightChild,value);}return node;}public void vist(Node node){if(node==null)return ;System.out.println(node.value);}public void PreOrderTravel(Node node)//先序遍历{if(node == null)//二叉树遍历先中后序指的是 根位置在遍历过程中的 位置return ;//其中二叉树遍历 都是先左后右vist(node);//先根PreOrderTravel(node.LeftChild);//然后左子树PreOrderTravel(node.RightChild);//最后右子树}public void PreOrderTravel()//先序遍历{PreOrderTravel(root);}public void PrintfNextOrderTravel(){NextOrderTravel(root);}public void NextOrderTravel(Node node)//后序遍历{ if(node==null)return ;//缩进//s.push(node);NextOrderTravel(node.LeftChild);//先左NextOrderTravel(node.RightChild);//然后右vist(node);//最后中}public void PrintfMidOrderTravel(){MidOrderTravel(root);}public void MidOrderTravel(Node node)//中序遍历{if(node==null)return ;//缩进MidOrderTravel(node.LeftChild);//先左vist(node);//然后中MidOrderTravel(node.RightChild);//最后右}public void PrintfFirstOrderTravel(){FirstOrderTravel(root);}public void FirstOrderTravel(Node node)//先序遍历的 非递归{Node p = node;while(p!=null||!s.isEmpty()){if(p!=null){s.push(p);System.out.println(p.value);//先输出 节点的值p = p.LeftChild;//遍历左子树}else{Node q=s.peek();//取栈顶元素s.pop();//System.out.println(q.value);p = q.RightChild;//遍历右子树}}}public void PrintfCentreOrderTravel()//中序遍历{CentreOrderTravel(root);}public void CentreOrderTravel(Node node){Node p = node;while(p!=null||!s.isEmpty()){if(p!=null){s.push(p);// System.out.println(p.value);p = p.LeftChild;//遍历左子树}else{Node q=s.peek();s.pop();System.out.println(q.value);p = q.RightChild;//遍历右子树}}}public void PrintfLastOrderTravel()//后序遍历{LastOrderTravel(root);}public void LastOrderTravel(Node node){Node p = node;//为根节点Stack<Node> stack = new Stack<>();while(p!=null||!s.isEmpty()){//自己想的算法,空间复杂度 会大一点,待验证正确性,目前来说测试数据 正确if(p!=null){//牺牲s栈用来当辅助栈,只是用s来储存入栈的节点s.push(p);//如果 我们先把当前节点入栈,再把当前节点的右子树入栈,再把当前节点的左子树入栈stack.push(p);//那么 出栈顺序即代表了 我们想要的 后序遍历,即左->右->根//p = p.LeftChild;//遍历左子树p = p.RightChild;//遍历右子树//}else{Node q=s.peek();//取栈顶s.pop();p = q.LeftChild;//遍历左子树//System.out.println(q.value);}}while(!stack.isEmpty()){System.out.println(stack.peek().value);stack.pop();}}
}
=========================================================================================
测试类:
package Tree;
import java.util.Scanner;public class BinaryTreeSearch {public static void main(String args[]){@SuppressWarnings("resource")Scanner cin = new Scanner(System.in);while(true){BinaryTree Tree = new BinaryTree();int n =cin.nextInt();int array[] = new int [n];// Random random = new Random();for(int i=0;i<n;i++)array[i] = cin.nextInt();//array[i]=i+1;for(int i=0;i<n;i++)System.out.print(array[i]+"*");System.out.println();Tree.Binary(array);System.out.println("先序遍历");Tree.PreOrderTravel();System.out.println("***********");System.out.println("中序遍历");Tree.PrintfMidOrderTravel();System.out.println("***********");System.out.println("后序遍历");Tree.PrintfNextOrderTravel();System.out.println("***********");System.out.println("中序遍历,非递归");Tree.PrintfCentreOrderTravel();System.out.println("***********");System.out.println("先序遍历,非递归");Tree.PrintfFirstOrderTravel();System.out.println("***********");System.out.println("后序遍历,非递归");Tree.PrintfLastOrderTravel();}//cin.close();}}
java 二叉树的各种遍历相关推荐
- Java 二叉树后序遍历(递归/非递归)
Java 二叉树后序遍历(递归/非递归) 简介: 遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次. 设L.D.R分 ...
- Java 二叉树中序遍历(递归/非递归)
Java 二叉树中序遍历(递归/非递归) 中序遍历 代码实现 递归方式 非递归方式 简介: 遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访 ...
- java二叉树的深度优先遍历_二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式...
1 packageSolution;2 3 importjava.util.LinkedList;4 importjava.util.Queue;5 importjava.util.Stack;6 7 ...
- Java二叉树后序遍历:递归与迭代
二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树:左子树和右子树又同样都是二叉树. 如下便是一棵二叉树: 二叉树的后序遍历方式为: 1. 如果根节点有左 ...
- Java二叉树逆序遍历_二叉树遍历小结
二叉树遍历小结 声明 0 二叉树遍历概述 二叉树遍历:按照既定序,对每个节点仅访问一次: 二叉树非递归遍历思想:参考这篇博文,核心思想是存在重合元素的局部有序保证整体有序,由于二叉树的结构特点,二叉树 ...
- java二叉树的创建,遍历及其他方法
2019独角兽企业重金招聘Python工程师标准>>> package tree;import java.util.Stack;/**二叉树**/ public class Bina ...
- java实现递归层次遍历_Java实现二叉树的前序、中序、后序、层序遍历(递归方法)...
在数据结构中,二叉树是树中我们见得最多的,二叉查找树可以加速我们查找的效率,那么输出一个二叉树也变得尤为重要了. 二叉树的遍历方法分为四种,分别为前序遍历.中序遍历.后序.层序遍历.下图即为一个二叉树 ...
- [Leedcode][JAVA][第102题][二叉树的层序遍历][递归][迭代][BFS]
[问题描述][第102题][二叉树的层序遍历][中等] 给你一个二叉树,请你返回其按 层序遍历 得到的节点值. (即逐层地,从左到右访问所有节点).示例: 二叉树:[3,9,20,null,null, ...
- java根据前序和中序建树_Java实现根据前序遍历构建二叉树(前序遍历、中序遍历、后序遍历)...
Java实现根据前序遍历构建二叉树(前序遍历.中序遍历.后序遍历),Java关于ACM的代码真的好少,想参考如何用java实现二叉树googl 前言 Java关于ACM的代码真的好少,想参考如何用ja ...
最新文章
- poj2723详解(二分 + 2-SAT)( 两种方法求解 )
- f5 ddos cc——Mitigating DDoS Attacks with F5 Technology
- SonarQube代码质量管理工具安装与使用(sonarqube5.1.2 + sonar-runner-dist-2.4 + MySQL5.x)
- win7下搭建nginx+php的开发环境
- Java MySql 连接数据库
- 使用Network Recycle Bin启用映射网络驱动器上的回收站
- 细说IIS异常日志 — 你必须知道的功能
- itunes备份包括哪些内容_企业形象策划包括哪些内容?
- Spring Security 之多AuthenticationProvider认证模式实现
- 【鱼眼镜头8】张正友畸变公式;鱼眼的畸变公式需要使用入射角
- php choosewxpay fail,人人商城常见问题解决方案
- 华为NP课程笔记25-SDN简介
- 中国草鱼养殖产业发展现状分析,生态养殖是未来发展趋势「图」
- 刘德华直播观看人数破亿
- X Server移植指导之三 输出层移植 (XServer Porting Guide)
- 孕妇饮食禁忌隐私政策
- matplotlib.pyplot.scatter( )绘制散点图与双月形图
- Kotlin学习(1)初识及环境搭建,大厂面试必备技能
- 【游戏逆向】FPS游戏自瞄透视模块动态加载分析
- 偏光显微镜基本原理及主要用途
热门文章
- BZOJ 2436 Noi嘉年华(优化DP)
- NEON在Android中的使用举例【转】
- 一个核物理学霸为何两次收到BlackHat的邀请
- TensorFlow教程之API DOC 6.1.4 Class tensorflow::Session
- webservice发布问题,部署iis后调用不成功
- SQLite多线程写锁文件解决方案
- 前端开发工具介绍----合成雪碧图工具(css sprite)
- AngularJS学习之旅—AngularJS 模块(十五)
- Xshell批量导入IP地址
- Mysql中添加汉字乱码无法识别问题