这里使用下图的二叉树作为例子:

首先建立树这个类:

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 RecursionBinaryTree { //先建立子节点,再建立父节点
public Node init(){
Node E = new Node(8,null,null);
Node C = new Node(6,E,null);
Node D = new Node(3,null,null);
Node B = new Node(2,D,null);
Node A = new Node(7, B, C);
return A; //返回根节点
} public void printNode(Node node){
System.out.print(node.getData());
}
//先序遍历:根左右的顺序遍历二叉树
public void firstTraversal(Node root){
printNode(root); //输出根节点数据
if(root.getLeftNode()!=null){
firstTraversal(root.getLeftNode());
}
if(root.getRightNode()!=null){
firstTraversal(root.getRightNode());
}
}
//中序遍历:左根右
public void inOrderTraversal(Node root){
if(root.getLeftNode()!=null){
inOrderTraversal(root.getLeftNode());
}
printNode(root);
if(root.getRightNode()!=null){
inOrderTraversal(root.getRightNode());
}
} //后序遍历:左右根
public void postOrderTraversal(Node root){
if(root.getLeftNode()!=null){
postOrderTraversal(root.getLeftNode());
}
if(root.getRightNode()!=null){
postOrderTraversal(root.getRightNode());
}
printNode(root);
} public static void main(String[] args) {
RecursionBinaryTree tree = new RecursionBinaryTree();
Node root = tree.init();
System.out.println("先序遍历:");
tree.firstTraversal(root);
System.out.println();
System.out.println("中序遍历:");
tree.inOrderTraversal(root);
System.out.println();
System.out.println("后序遍历:");
tree.postOrderTraversal(root);
}
}

再看看使用非递归的方式遍历二叉树,面试的时候会经常问到使用非递归的方式实现二叉树的中序遍历。

//堆栈遍历二叉树
public class StackBinaryTree { public Node init(){
Node E = new Node(8,null,null);
Node C = new Node(6,E,null);
Node D = new Node(3,null,null);
Node B = new Node(2,D,null);
Node A = new Node(5, B, C);
return A; //返回根节点
} public void printNode(Node node){
System.out.print(node.getData());
}
//先序遍历:根左右
public void firstTraversal(Node root){
Stack<Node> stack = new Stack<>(); //定义一个栈
while (root!=null||stack.size()>0){ //判断节点是否为空或者栈中是否为空,当均为空时,结束循环
if(root!=null){
printNode(root);
stack.push(root);
root = root.getLeftNode();
}else {
root = stack.pop();
root = root.getRightNode();
}
}
} //中序遍历:左根右
public void inOrderTraversal(Node root){
Stack<Node> stack = new Stack<>(); //定义一个栈
while (root!=null||stack.size()>0){
if(root!=null){
stack.push(root); //直接压入栈
root = root.getLeftNode();
}else {
root = stack.pop(); //出栈时输出下
printNode(root);
root = root.getRightNode();
}
}
} public void postOrderTraversal(Node root){
Stack<Node> stack = new Stack<>();
Stack<Node> output = new Stack<>();//构造一个中间栈存储后序遍历的结果
while (root!=null||stack.size()>0){
if(root!=null){
output.push(root);
stack.push(root);
root = root.getRightNode();
}else {
root = stack.pop();
root = root.getLeftNode();
}
}
while (output.size()>0){
printNode(output.pop());
}
} public static void main(String[] args) {
StackBinaryTree tree = new StackBinaryTree();
Node root = tree.init();
System.out.println("先序遍历:");
tree.firstTraversal(root);
System.out.println("中序遍历:");
tree.inOrderTraversal(root);
System.out.println("后序遍历:");
tree.postOrderTraversal(root);
}
}

java实现二叉树的前中后遍历(递归和非递归)的更多相关文章

  1. Java 非递归实现 二叉树的前中后遍历以及层级遍历

    class MyBinaryTree<T> { BinaryNode<T> root; public MyBinaryTree() { root = new BinaryNod ...

  2. Qt实现 动态化遍历二叉树(前中后层次遍历)

    binarytree.h 头文件 #ifndef LINKEDBINARYTREE_H #define LINKEDBINARYTREE_H #include<c++/algorithm> ...

  3. 二叉树的建立&&前中后遍历(递归实现)&&层次遍历

    下面代码包含了二叉树的建立过程,以及三种遍历方法了递归实现,代码中还利用队列实现了层次遍历. import java.util.LinkedList; import java.util.Queue; ...

  4. Binary Tree Traversal 二叉树的前中后序遍历

    [抄题]:二叉树前序遍历 [思维问题]: 不会递归.三要素:下定义.拆分问题(eg root-root.left).终止条件 [一句话思路]: 节点非空时往左移,否则新取一个点 再往右移. [输入量] ...

  5. POJ 2255 Tree Recovery && Ulm Local 1997 Tree Recovery (二叉树的前中后序遍历)

    链接:poj.org/problem?id=2255 本文链接:http://www.cnblogs.com/Ash-ly/p/5463375.html 题意: 分别给你一个二叉树的前序遍历序列和中序 ...

  6. 二叉树前中后/层次遍历的递归与非递归形式(c++)

    /* 二叉树前中后/层次遍历的递归与非递归形式 */ //*************** void preOrder1(BinaryTreeNode* pRoot) { if(pRoot==NULL) ...

  7. Java实现二叉树的先序、中序、后序、层序遍历(递归和非递归)

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

  8. [C++] 非递归实现前中后序遍历二叉树

    目录 前置技能 需求描述 binarytree.h 具体实现 binarytree.cpp main.cpp 网上代码一搜一大片,大同小异咯. 书上的函数实现代码甚至更胜一筹,而且抄一遍就能用,唯一问 ...

  9. 【C++】二叉树的遍历(前中后)- 迭代法

    力扣题目:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/ 今天自己琢磨了很久如何不用递归将二叉树的遍历写出来,于是乎写出 ...

随机推荐

  1. Sass之混合宏、继承、占位符

    1.混合宏. 当样式变得越来越复杂,需要重复使用大段的样式时,使用变量就无法达到我们目的了.这个时候混合宏就派上用场了. 而使用混合宏时,首先要声明混合宏,而声明混合宏时有两种,不带参数混合宏和带参数 ...

  2. Android简介(一)

    Android构架 Android的系统架构和其操作系统一样,采用了分层的架构.从架构图看,android分为四个层,从高层到低层分别是应用程序层.应用架构层.系统运行库层和Linux核心层. 1. ...

  3. 空数组在以下三种遍历中均不可更改:forEach、map和for...in

    首先,我们要知道对于forEach.map和for...in三种遍历,在不是空数组的情况下,要想实现更改原数组的方法,代码如下: var list = [1,2,3,4]; var list1 = [ ...

  4. Oracle:FOR循环语句练习

    --打印输出从1到10的正整数DECLARE v_i NUMBER(10) := 0;BEGIN LOOP v_i := v_i + 1; DBMS_OUTPUT.put_line(v_i); EXI ...

  5. 如何用SVN版本控制器将提交的文件还原到以前的版本

    工具/原料 SVN乌龟软件和相关的文件 方法/步骤 在相关的文件中右击鼠标,按右图进行选择 在弹出框的地方点击我标记的地方,查看下曾经提交过的版本文件 在弹出框的地方,上面就是有版本号,下面就是我们文 ...

  6. HTTP 405 错误 – 方法不被允许 (Method not allowed)【转载】

    介绍 HTTP 协议定义一些方法,以指明为获取客户端(如您的浏览器或我们的 CheckUpDown 机器人)所指定的具体网址资源而需要在 Web 服务器上执行的动作.则这些方法如下: OPTIONS( ...

  7. 学习javascript数据结构(四)——树

    前言 总括: 本文讲解了数据结构中的[树]的概念,尽可能通俗易懂的解释树这种数据结构的概念,使用javascript实现了树,如有纰漏,欢迎批评指正. 原文博客地址:学习javascript数据结构( ...

  8. MySQL Block Nested Loop and Batched Key Access Joins(块嵌套循环和批量Key访问连接)

    Block Nested-Loop and Batched Key Access Joins Batched Key Access (BKA) Join算法通过index和join buffer访问j ...

  9. Oracle问题之literal does not match format string

    问题: oerr ora 186101861, 00000, "literal does not match format string"// *Cause: Literals i ...

  10. 解决span的bug--不能自动换行的问题

    span标签元素不能自动换行,在超出父盒子的宽度后不能够自动换行 如下界面: 解决办法:将span属性加上display:block设置为行级元素:设置宽度然后在强制断行 效果如下: