您的位置:首页 > 其它

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

2014-05-25 12:11 477 查看
本文对二叉树的前序遍历、中序遍历、后序遍历的递归和非递归算法分别进行了代码演示,供大家参考。代码如下:

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐