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 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实现二叉树的前中后遍历(递归和非递归)的更多相关文章
- Java 非递归实现 二叉树的前中后遍历以及层级遍历
class MyBinaryTree<T> { BinaryNode<T> root; public MyBinaryTree() { root = new BinaryNod ...
- Qt实现 动态化遍历二叉树(前中后层次遍历)
binarytree.h 头文件 #ifndef LINKEDBINARYTREE_H #define LINKEDBINARYTREE_H #include<c++/algorithm> ...
- 二叉树的建立&&前中后遍历(递归实现)&&层次遍历
下面代码包含了二叉树的建立过程,以及三种遍历方法了递归实现,代码中还利用队列实现了层次遍历. import java.util.LinkedList; import java.util.Queue; ...
- Binary Tree Traversal 二叉树的前中后序遍历
[抄题]:二叉树前序遍历 [思维问题]: 不会递归.三要素:下定义.拆分问题(eg root-root.left).终止条件 [一句话思路]: 节点非空时往左移,否则新取一个点 再往右移. [输入量] ...
- POJ 2255 Tree Recovery && Ulm Local 1997 Tree Recovery (二叉树的前中后序遍历)
链接:poj.org/problem?id=2255 本文链接:http://www.cnblogs.com/Ash-ly/p/5463375.html 题意: 分别给你一个二叉树的前序遍历序列和中序 ...
- 二叉树前中后/层次遍历的递归与非递归形式(c++)
/* 二叉树前中后/层次遍历的递归与非递归形式 */ //*************** void preOrder1(BinaryTreeNode* pRoot) { if(pRoot==NULL) ...
- Java实现二叉树的先序、中序、后序、层序遍历(递归和非递归)
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...
- [C++] 非递归实现前中后序遍历二叉树
目录 前置技能 需求描述 binarytree.h 具体实现 binarytree.cpp main.cpp 网上代码一搜一大片,大同小异咯. 书上的函数实现代码甚至更胜一筹,而且抄一遍就能用,唯一问 ...
- 【C++】二叉树的遍历(前中后)- 迭代法
力扣题目:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/ 今天自己琢磨了很久如何不用递归将二叉树的遍历写出来,于是乎写出 ...
随机推荐
- IO代码记忆
FileWriter fw = new FileWriter("hello.txt"); String s = "hello world"; fw.write( ...
- SSL和SSH有什么区别
SSL 是一种安全协议,它为网络(例如因特网)的通信提供私密性.SSL 使应用程序在通信时不用担心被窃听和篡改. SSL 实际上 是共同工作的两个协议:"SSL 记录协议"(SSL ...
- mybatis_helloWorld_sequence图(3)
摘录自:http://blog.csdn.net/y172158950/article/details/17006127 1. 依据resource获取Reader的sequence图 String ...
- wigs的理解和应用
1. 首先了解下,Web应用的本质,大体如下: 1.浏览器发送一个HTTP请求: 2.服务器收到请求,生成一个HTML文档: 3.服务器把HTML文档作为HTTP响应的Body发送给浏览器: 4.浏览 ...
- mysql-高性能索引策略
原文转自:http://www.cnblogs.com/happyflyingpig/p/7655762.html 独立索引: 独立索引是指索引列不能是表达式的一部分,也不能是函数的参数 例1: SE ...
- 2018年web前端学习路线图
前端的的技术一直在变化,更新和变革,现在基本是三驾马车(vue,angualr,react)主导整个前端框架,但是无论对于新人或者有经验的程序员,这些知识在必须掌握 前端必会技能 上图罗列了整个前端的 ...
- js 原型 函数和对象的关系
函数就是对象的一种 instanceof 可以做判断 var fn = function(){}; fn instanceof Object //true Object构造函数的prototype ...
- 洛谷P1233 [木棍加工]
主要思路: 这道题一眼看过去就可以贪心.. 首先可以按L排序.. 显然排序之后我们就可以抛开L不管了.. 然后就可以愉快的贪心了.. 细节: 这道题可以看成用 最少的合法序列(详见原题) 装下所有木棍 ...
- MySQL两大存储引擎InnoDB与MyISAM
1.InnoDB存储引擎 MySQL5.5中InnoDB成为默认的存储引擎.InnoDB是事务型存储引擎,被设计用来处理大量的短期事务.它的性能和自动崩溃恢复特性,使得它在非事务场景中也很流行. 所以 ...
- JAVA中正则表达式常用的四个方法
JAVA中正则表达式处理字符串的四个常用方法:匹配.分割.替换.截取.其跟字符串的常用函数相似,但是使用正则表达式会更简单.更加简洁.下面是具体的例子: public class TestRegex ...