二叉树的前序遍历、中序遍历和后序遍历的递归和非递归算法
来源:互联网 发布:windows讲述人 编辑:程序博客网 时间:2024/04/30 10:56
本文对二叉树的前序遍历、中序遍历、后序遍历的递归和非递归算法分别进行了代码演示,供大家参考。代码如下:
public class BinaryTree {/** * 二叉树的前序遍历递归算法 * * @param rootNode 二叉树的根节点 */public void preOrderbyRecursion(BinaryTreeNode rootNode) {if(rootNode != null) {visitNode(rootNode);preOrderbyRecursion(rootNode.getLchild());preOrderbyRecursion(rootNode.getRchild());}}/** * 二叉树的前序遍历的非递归算法 * * @param rootNode 二叉树的根节点 */public void preOrderbyHeap(BinaryTreeNode rootNode) {LinkHeap lh = new LinkHeap();BinaryTreeNode p = rootNode;if(rootNode != null) {do {while(p != null) {visitNode(p);lh.push(p);p = p.getLchild();}p = (BinaryTreeNode)lh.pop();p = p.getRchild();}while(p != null || !lh.isEmpty());}}/** * 二叉树的中序遍历递归算法 * * @param rootNode 二叉树的根节点 */public void inOrderbyRecursion(BinaryTreeNode rootNode) {if(rootNode != null) {inOrderbyRecursion(rootNode.getLchild());visitNode(rootNode);inOrderbyRecursion(rootNode.getRchild());}}/** * 二叉树的中序遍历的非递归算法 * * @param rootNode 二叉树的根节点 */public void inOrderbyHeap(BinaryTreeNode rootNode) {LinkHeap lh = new LinkHeap();BinaryTreeNode p = rootNode;if(rootNode != null) {do {while(p != null) {lh.push(p);p = p.getLchild();}p = (BinaryTreeNode)lh.pop();visitNode(p);p = p.getRchild();} while(p != null || !lh.isEmpty());}}/** * 二叉树的后序遍历递归算法 * * @param rootNode 二叉树的根节点 */public void postOrderbyRecursion(BinaryTreeNode rootNode) {if(rootNode != null) {postOrderbyRecursion(rootNode.getLchild());postOrderbyRecursion(rootNode.getRchild());visitNode(rootNode);}}/** * 二叉树的后序遍历的非递归算法 * * @param rootNode 二叉树的根节点 */public void postOrderbyHeap(BinaryTreeNode rootNode) {LinkHeap lhNode = new LinkHeap();LinkHeap lhFlag = new LinkHeap();BinaryTreeNode p = rootNode;int flag = 0;if(rootNode != null) {do {while (p != null) {lhNode.push(p);lhFlag.push(0);p = p.getLchild();}p = (BinaryTreeNode)lhNode.pop();flag = (int)lhFlag.pop();if(flag == 0) {lhNode.push(p);lhFlag.push(1);p = p.getRchild();} else {visitNode(p);p = null;}}while(p != null || !lhNode.isEmpty());}}private void visitNode(BinaryTreeNode p) {System.out.print(p.getData() + " ");}}
算法中出现的二叉树结点类BinaryTreeNode如下:
public class BinaryTreeNode {private Object data;private BinaryTreeNode lchild;private BinaryTreeNode rchild;public Object getData() {return data;}public void setData(Object data) {this.data = data;}public BinaryTreeNode getLchild() {return lchild;}public void setLchild(BinaryTreeNode lchild) {this.lchild = lchild;}public BinaryTreeNode getRchild() {return rchild;}public void setRchild(BinaryTreeNode rchild) {this.rchild = rchild;}public BinaryTreeNode() {this.data = null;this.lchild = null;this.rchild = null;}public BinaryTreeNode(Object data) {this.data = data;this.lchild = null;this.rchild = null;}}
算法中出现的链式堆栈类LinkHeap如下:
public class LinkHeap {private LinkHeapNode topNode = null;public boolean isEmpty() {return topNode == null;}public void push(Object data) {LinkHeapNode p = new LinkHeapNode(data, topNode);topNode = p;}public Object pop() {if(isEmpty()) {return null;}else {Object data = topNode.getData();topNode = topNode.getNext();return data;}}public Object get() {return isEmpty() ? null : topNode.getData();}}链栈类中出现的链栈结点类LinkHeapNode的代码如下:
public class LinkHeapNode {private Object data;private LinkHeapNode next;public LinkHeapNode() {this.data = null;this.next = null;}public LinkHeapNode(Object data) {this.data = data;this.next = null;}public LinkHeapNode(Object data, LinkHeapNode next) {this.data = data;this.next = next;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public LinkHeapNode getNext() {return next;}public void setNext(LinkHeapNode next) {this.next = next;}}
0 0
- 二叉树的前序遍历、中序遍历和后序遍历的递归和非递归算法
- 【二叉树】 前序、中序和后序的递归遍历与非递归遍历
- 【二叉树】非递归遍历的通用算法:前序、中序和后序
- 数据结构:二叉树的前序,中序,后序遍历(递归和非递归)
- 二叉树的递归和非递归遍历(前序、中序、后序)
- 二叉树的前序,中序,后序遍历。用递归和非递归实现
- 二叉树的递归和非递归前、中、后序遍历
- 二叉树的前序、中序、后序遍历的算法(递归形式和非递归形式)
- 二叉树的遍历 前序 中序 后序 分别实现递归和非递归遍历方式
- 二叉树的前、中、后序遍历(递归和非递归)、层序遍历、深度、叶子节点个数
- 二叉树的遍历(前序,中序,后序,层序)--递归和非递归算法实现
- 二叉查找树的概念以及实现 前序、中序和后序递归非递归遍历算法
- C++二叉树之构造拷贝赋值,递归和非递归的前序遍历,中序遍历和后序遍历,以及层序遍历
- 二叉树的非递归【前/中/后 序遍历】
- 二叉树的先序、中序、后序递归遍历和非递归遍历
- 非递归实现二叉树的后序遍历、前序遍历、中序遍历
- 二叉树的遍历(前 中 后序 )递归 非递归算法
- (前、中、后)序遍历二叉树的递归、非递归算法!
- OpenCV学习之五: 如何用指令启动或关闭OpenCV的CPU指令集CV_SSE2,CV_SSSE4等优化
- C++空类默认函数
- Android adb shell am/pm使用
- BZOJ [Usaco2007 Jan]Protecting the Flowers 护花(隐藏题)
- hibernate_Restrictions用法
- 二叉树的前序遍历、中序遍历和后序遍历的递归和非递归算法
- 面向对象三个特性
- cocos2d-x3.0 关于CCAnimate 的一些资料
- C# set和get如何用
- 测试2
- Hibernate性能优化
- poj 3356 AGTC(dp,最小编辑距离)
- [连载]Java程序设计(04)---任务驱动方式:工资结算系统
- OCP 1Z0 051 116