二叉树的前序遍历、中序遍历和后序遍历的递归和非递归算法

来源:互联网 发布: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
原创粉丝点击