二叉树的前序遍历、中序遍历和后序遍历的递归和非递归算法
2014-05-25 12:11
477 查看
本文对二叉树的前序遍历、中序遍历、后序遍历的递归和非递归算法分别进行了代码演示,供大家参考。代码如下:
算法中出现的二叉树结点类BinaryTreeNode如下:
算法中出现的链式堆栈类LinkHeap如下:
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; } }
相关文章推荐
- 面试题 二叉树的前序遍历,中序遍历,后序遍历(递归实现)
- 二叉树 前序遍历的非递归实现 中序遍历的非递归实现 后序遍历的非递归实现 创建二叉树
- C++实现二叉树 前序遍历, 后序遍历, 中序遍历, 层序遍历(不用递归)
- 二叉树经典面试题解析一:用非递归实现二叉树的前序遍历,中序遍历,后序遍历
- 扩展二叉树 建立 以及 前序遍历 中序遍历 后序遍历 的非递归算法
- 对于已知二叉树的中序遍历和后序遍历如何求二叉树的的前序遍历
- C++数据结构--二叉树的前序遍历,中序遍历,后序遍历
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 递归方法 前序 中序 后序 遍历二叉树
- c之二叉树链表操作---建立、(递归)前序遍历、中序遍历、后序遍历
- 二叉树创建、前序遍历、中序遍历、后序遍历 的 递归与非递归实现 以及 层次遍历
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 二叉树的前序遍历、中序遍历及后序遍历
- java版的二叉树的先序遍历、中序遍历以及后序遍历(递归以及非递归方式)
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 二叉树的前序遍历,中序遍历,后序遍历以及相互之间的求法
- 已知二叉树的前序遍历,中序遍历,求后序遍历的问题。
- 二叉树的前序遍历、中序遍历、后续遍历 (包括递归、非递归,共六种)
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果