Java实现二叉树先序,中序,后序遍历
以下是我要解析的一个二叉树的模型形状
接下来废话不多直接上代码
一种是用递归的方法,另一种是用堆栈的方法:
首先创建一棵树:
- public class Node {
- private int data;
- private Node leftNode;
- private Node rightNode;
- public Node(int data, Node leftNode, Node rightNode){
- this.data = data;
- this.leftNode = leftNode;
- this.rightNode = rightNode;
- }
- public int getData() {
- return data;
- }
- public void setData(int data) {
- this.data = data;
- }
- public Node getLeftNode() {
- return leftNode;
- }
- public void setLeftNode(Node leftNode) {
- this.leftNode = leftNode;
- }
- public Node getRightNode() {
- return rightNode;
- }
- public void setRightNode(Node rightNode) {
- this.rightNode = rightNode;
- }
- }
递归:
- public class BinaryTree {
- /**
- * @author yaobo
- * 二叉树的先序中序后序排序
- */
- public Node init() {//注意必须逆序建立,先建立子节点,再逆序往上建立,因为非叶子结点会使用到下面的节点,而初始化是按顺序初始化的,不逆序建立会报错
- Node J = new Node(, null, null);
- Node H = new Node(, null, null);
- Node G = new Node(, null, null);
- Node F = new Node(, null, J);
- Node E = new Node(, H, null);
- Node D = new Node(, null, G);
- Node C = new Node(, F, null);
- Node B = new Node(, D, E);
- Node A = new Node(, B, C);
- return A; //返回根节点
- }
- public void printNode(Node node){
- System.out.print(node.getData());
- }
- public void theFirstTraversal(Node root) { //先序遍历
- printNode(root);
- if (root.getLeftNode() != null) { //使用递归进行遍历左孩子
- theFirstTraversal(root.getLeftNode());
- }
- if (root.getRightNode() != null) { //递归遍历右孩子
- theFirstTraversal(root.getRightNode());
- }
- }
- public void theInOrderTraversal(Node root) { //中序遍历
- if (root.getLeftNode() != null) {
- theInOrderTraversal(root.getLeftNode());
- }
- printNode(root);
- if (root.getRightNode() != null) {
- theInOrderTraversal(root.getRightNode());
- }
- }
- public void thePostOrderTraversal(Node root) { //后序遍历
- if (root.getLeftNode() != null) {
- thePostOrderTraversal(root.getLeftNode());
- }
- if(root.getRightNode() != null) {
- thePostOrderTraversal(root.getRightNode());
- }
- printNode(root);
- }
- public static void main(String[] args) {
- BinaryTree tree = new BinaryTree();
- Node root = tree.init();
- System.out.println("先序遍历");
- tree.theFirstTraversal(root);
- System.out.println("");
- System.out.println("中序遍历");
- tree.theInOrderTraversal(root);
- System.out.println("");
- System.out.println("后序遍历");
- tree.thePostOrderTraversal(root);
- System.out.println("");
- }
- }
堆栈:
- public class BinaryTree1 {
- public Node init() {//注意必须逆序建立,先建立子节点,再逆序往上建立,因为非叶子结点会使用到下面的节点,而初始化是按顺序初始化的,不逆序建立会报错
- Node J = new Node(, null, null);
- Node H = new Node(, null, null);
- Node G = new Node(, null, null);
- Node F = new Node(, null, J);
- Node E = new Node(, H, null);
- Node D = new Node(, null, G);
- Node C = new Node(, F, null);
- Node B = new Node(, D, E);
- Node A = new Node(, B, C);
- return A; //返回根节点
- }
- public void printNode(Node node){
- System.out.print(node.getData());
- }
- public void theFirstTraversal_Stack(Node root) { //先序遍历
- Stack<Node> stack = new Stack<Node>();
- Node node = root;
- while (node != null || stack.size() > ) { //将所有左孩子压栈
- if (node != null) { //压栈之前先访问
- printNode(node);
- stack.push(node);
- node = node.getLeftNode();
- } else {
- node = stack.pop();
- node = node.getRightNode();
- }
- }
- }
- public void theInOrderTraversal_Stack(Node root) { //中序遍历
- Stack<Node> stack = new Stack<Node>();
- Node node = root;
- while (node != null || stack.size() > ) {
- if (node != null) {
- stack.push(node); //直接压栈
- node = node.getLeftNode();
- } else {
- node = stack.pop(); //出栈并访问
- printNode(node);
- node = node.getRightNode();
- }
- }
- }
- public void thePostOrderTraversal_Stack(Node root) { //后序遍历
- Stack<Node> stack = new Stack<Node>();
- Stack<Node> output = new Stack<Node>();//构造一个中间栈来存储逆后序遍历的结果
- Node node = root;
- while (node != null || stack.size() > ) {
- if (node != null) {
- output.push(node);
- stack.push(node);
- node = node.getRightNode();
- } else {
- node = stack.pop();
- node = node.getLeftNode();
- }
- }
- System.out.println(output.size());
- while (output.size() > ) {
- printNode(output.pop());
- }
- }
- public static void main(String[] args) {
- BinaryTree1 tree = new BinaryTree1();
- Node root = tree.init();
- System.out.println("先序遍历");
- tree.theFirstTraversal_Stack(root);
- System.out.println("");
- System.out.println("中序遍历");
- tree.theInOrderTraversal_Stack(root);
- System.out.println("");
- System.out.println("后序遍历");
- tree.thePostOrderTraversal_Stack(root);
- System.out.println("");
- }
- }
Java实现二叉树先序,中序,后序遍历的更多相关文章
- 分别求二叉树前、中、后序的第k个节点
一.求二叉树的前序遍历中的第k个节点 //求先序遍历中的第k个节点的值 ; elemType preNode(BTNode *root,int k){ if(root==NULL) return ' ...
- [Java]算术表达式求值之二(中序表达式转后序表达式方案,支持小数)
Inlet类,入口类,这个类的主要用途是验证用户输入的算术表达式: package com.hy; import java.io.BufferedReader; import java.io.IOEx ...
- [Java]算术表达式求值之一(中序表达式转后序表达式方案)
第二版请见:https://www.cnblogs.com/xiandedanteng/p/11451359.html 入口类,这个类的主要用途是粗筛用户输入的算术表达式: package com.h ...
- 前、中、后序遍历随意两种是否能确定一个二叉树?理由? && 栈和队列的特点和区别
前序和后序不能确定二叉树理由:前序和后序在本质上都是将父节点与子结点进行分离,但并没有指明左子树和右子树的能力,因此得到这两个序列只能明确父子关系,而不能确定一个二叉树. 由二叉树的中序和前序遍历序列 ...
- 已知树的前序、中序,求后序的java实现&已知树的后序、中序,求前序的java实现
public class Order { int findPosInInOrder(String str,String in,int position){ char c = str.charAt(po ...
- DS Tree 已知先序、中序 => 建树 => 求后序
参考:二叉树--前序和中序得到后序 思路历程: 在最初敲的时候,经常会弄混preorder和midorder的元素位置.大体的思路就是在preorder中找到根节点(根节点在序列的左边),然后在mid ...
- TZOJ 3209 后序遍历(已知中序前序求后序)
描述 在数据结构中,遍历是二叉树最重要的操作之一.所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问. 这里给出三种遍历算法. 1.中序遍历的递归算法定义: ...
- java 根据二叉树前序 ,中序求后续
在一棵二叉树总,前序遍历结果为:ABDGCEFH,中序遍历结果为:DGBAECHF,求后序遍历结果. 我们知道: 前序遍历方式为:根节点->左子树->右子树 中序遍历方式为:左子树-> ...
- hdu1710-Binary Tree Traversals (由二叉树的先序序列和中序序列求后序序列)
http://acm.hdu.edu.cn/showproblem.php?pid=1710 Binary Tree Traversals Time Limit: 1000/1000 MS (Java ...
- LeetCode:二叉树的前、中、后序遍历
描述: ------------------------------------------------------- 前序遍历: Given a binary tree, return the pr ...
随机推荐
- php5.3.*编译出现make: *** [ext/gd/libgd/gd_compat.lo] Error 1 解决方法
升级系统,把php5.2.9升级到5.3.6,按照以前的编译参数,configure能正常通过,但是在make的时候提示: In file included from /root/php-5.3.6 ...
- Chrome浏览器网页截全屏算法以及实现
做个一个简单的批量下载插件叫“挖一下”, 正如插件的名字一样,采集网页里面的所有图片,根据筛选条件过滤不需要的图片,最后下载选中的图片. 索性把网页也一起给截了,截屏分两种: 1.可见内容截屏 2.完 ...
- CPU内存管理和linux内存分页机制
一.概念 物理地址(physical address)用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应.——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理 ...
- 读书笔记:《HTML5开发手册》Web表单
这是补充HTML5基础知识的第五篇内容,其他为: 一.HTML5-- 新的结构元素 二.HTML5-- figure.time.details.mark 三.HTML5-- details活学活用 四 ...
- ETL的经验总结
ETL的考虑 做数据仓库系统,ETL是关键的一环.说大了,ETL是数据整合解决方案,说小了,就是倒数据的工具.回忆一下工作这么些年来,处理数据迁移.转换的工作倒还真的不少.但是那些工作基 ...
- TreeView控制消息
控制消息的作用 通过发送消息到Treeview控件, 就能够控机Treeview控件.常用的控制有: 获取被点击的节点 获取节点的文本 设置节点的文本 获取节点的父节点 获取节点的子节点 TVM_GE ...
- android 蓝牙连接与通讯(Bluetooth)
最近做了一个小项目,关于蓝牙的一个智能硬件.其中涉及到了蓝牙模块的操作.特记下蓝牙模块的操作过程.只记录下关于蓝牙部分的操作,具体业务逻辑不涉及其中.重点是记录下蓝牙的扫描.链接.通讯. 在使用蓝牙模 ...
- radio里面value值与其他字符进行比较
本题旨在创建一个具有及时反馈的选择题,当选完其中一个选项后,会有弹窗来提醒你选择的答案是正确还是错误的.<div id="text" style="display: ...
- Latex 使用小技巧
Latex引用多篇参考文献 连续引用参考文献时中间中破折号连起来:[1,2,3,4]—>[1-4] 这是只需要在文档开始加入下面语句命令: \usepackage[numbers,sort&am ...
- 在2002年的老电脑上安装Debian
在2002年自己花了家里八千多元买了一台联想昭笔记本电脑.配置是PIII 750 Hz, 128 MB内存(后来升级到了320 MB).那个时候大学里买笔记本电脑的人还不多,宿舍里的同学大都攒的台式机 ...