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

首先建立树这个类:

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. Spark算子--flatMapValues

    转载请标明出处http://www.cnblogs.com/haozhengfei/p/e7a46cecc65720997392516d553d9891.html flatMapValues--Tra ...

  2. Spark算子--mapValues

    转载请标明出处http://www.cnblogs.com/haozhengfei/p/ccc9d6b5c46ac7209c1e104bd219bfb4.html mapValues--Transfo ...

  3. WPF 实现新手指引功能 DEMO

    需求 1.接口化.其他人实现接口就行 2.动态定位到visualTree中任意控件位置,即随意只显示任何部位 3.指示文本控件和箭头控件随意更改(位置,大小,高度,偏移等基本属性) 4.抽出主题 [d ...

  4. ZooKeeper 分布式共享锁的实现

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/8352919.html ------------------------------------ ...

  5. 阿里云邮件服务器怎么设置才能在QQ邮箱访问,互发邮件?

    必须要在阿里云邮上打开IMAP和SMTP IMAP能够代发代收.在线更改.垃圾拦截,比POP3好: 记住打开的协议号: IMAP:143 带SSL:993 SMTP: 25 带SSL:465 前提是能 ...

  6. JS和H5做一个音乐播放器,附带源码

    http://mp.weixin.qq.com/s/KpXT9X46AMlUVXQvpHuXGQ 效果图: 实现的功能 1.首页 2.底部播放控件 3.播放页面 4.播放列表 5.排行榜 6.音乐搜索 ...

  7. 邓_html_选项卡

    ================================================= ================[  选项卡  ]================= ======= ...

  8. PowerDesigner设置null约束

    在PDM的表属性的字段列表中每行最后的P,F,M中的M(Mandatory)打勾就可以了,这样在生成的SQL中会变成not NULL Mandatory:强制的,不知道是不是可以理解为必须赋值的

  9. _0_web_基础

    创:18_3_2017修:20_3_2017 什么是前端? --在浏览器中展示内容以及处理请求 什么是浏览器? --一款能将网页内容展现给用户查看,并且让用户与网页交互的软件 什么是内核? --渲染引 ...

  10. LINUX读写文件区别

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...