二叉树遍历(递归,非递归)
来源:互联网 发布:小脑袋调价软件 编辑:程序博客网 时间:2024/05/22 07:58
二叉树的 遍历的 几种方法
import java.util.Stack;public class BinaryTree {protected Node root;public BinaryTree(Node root) {this.root = root;}public Node getRoot() {return root;}/** 访问节点 */public static void visit(Node p) {System.out.print(p.getKey() + " ");}/** 递归实现前序遍历 */protected static void preorder(Node p) {if (p != null) {visit(p);preorder(p.getLeft());preorder(p.getRight());}}/** 递归实现中序遍历 */protected static void inorder(Node p) {if (p != null) {inorder(p.getLeft());visit(p);inorder(p.getRight());}}/** 递归实现后序遍历 */protected static void postorder(Node p) {if (p != null) {postorder(p.getLeft());postorder(p.getRight());visit(p);}}/** 非递归实现前序遍历 */protected static void iterativePreorder(Node p) {Stack<Node> stack = new Stack<Node>();if (p != null) {stack.push(p);while (!stack.empty()) {p = stack.pop();visit(p);if (p.getRight() != null)stack.push(p.getRight());if (p.getLeft() != null)stack.push(p.getLeft());}}}/** 非递归实现前序遍历2 */protected static void iterativePreorder2(Node p) {Stack<Node> stack = new Stack<Node>();Node node = p;while (node != null || stack.size() > 0) {while (node != null) {//压入所有的左节点,压入前访问它visit(node);stack.push(node);node = node.getLeft();}if (stack.size() > 0) {//node = stack.pop();node = node.getRight();}}}/** 非递归实现后序遍历 */protected static void iterativePostorder(Node p) {Node q = p;Stack<Node> stack = new Stack<Node>();while (p != null) {// 左子树入栈for (; p.getLeft() != null; p = p.getLeft())stack.push(p);// 当前节点无右子或右子已经输出while (p != null && (p.getRight() == null || p.getRight() == q)) {visit(p);q = p;// 记录上一个已输出节点if (stack.empty())return;p = stack.pop();}// 处理右子stack.push(p);p = p.getRight();}}/** 非递归实现后序遍历 双栈法 */protected static void iterativePostorder2(Node p) {Stack<Node> lstack = new Stack<Node>();Stack<Node> rstack = new Stack<Node>();Node node = p, right;do {while (node != null) {right = node.getRight();lstack.push(node);rstack.push(right);node = node.getLeft();}node = lstack.pop();right = rstack.pop();if (right == null) {visit(node);} else {lstack.push(node);rstack.push(null);}node = right;} while (lstack.size() > 0 || rstack.size() > 0);}/** 非递归实现后序遍历 单栈法*/protected static void iterativePostorder3(Node p) {Stack<Node> stack = new Stack<Node>();Node node = p, prev = p;while (node != null || stack.size() > 0) {while (node != null) {stack.push(node);node = node.getLeft();}if (stack.size() > 0) {Node temp = stack.peek().getRight();if (temp == null || temp == prev) {node = stack.pop();visit(node);prev = node;node = null;} else {node = temp;}}}}/** 非递归实现后序遍历4 双栈法*/protected static void iterativePostorder4(Node p) {Stack<Node> stack = new Stack<Node>();Stack<Node> temp = new Stack<Node>();Node node = p;while (node != null || stack.size() > 0) {while (node != null) {temp.push(node);stack.push(node);node = node.getRight();}if (stack.size() > 0) {node = stack.pop();node = node.getLeft();}}while (temp.size() > 0) {node = temp.pop();visit(node);}}/** 非递归实现中序遍历 */protected static void iterativeInorder(Node p) {Stack<Node> stack = new Stack<Node>();while (p != null) {while (p != null) {if (p.getRight() != null)stack.push(p.getRight());// 当前节点右子入栈stack.push(p);// 当前节点入栈p = p.getLeft();}p = stack.pop();while (!stack.empty() && p.getRight() == null) {visit(p);p = stack.pop();}visit(p);if (!stack.empty())p = stack.pop();elsep = null;}}/** 非递归实现中序遍历2 */protected static void iterativeInorder2(Node p) {Stack<Node> stack = new Stack<Node>();Node node = p;while (node != null || stack.size() > 0) {while (node != null) {stack.push(node);node = node.getLeft();}if (stack.size() > 0) {node = stack.pop();visit(node);node = node.getRight();}}}}
0 0
- 二叉树遍历(递归,非递归)
- 二叉树遍历(递归、非递归、Morris遍历)
- 二叉树遍历(递归、非递归、Morris遍历)
- 二叉树的遍历(递归+非递归+层次遍历)
- 二叉树建立、递归、非递归遍历
- JAVA递归、非递归遍历二叉树
- 非递归、递归遍历二叉树!
- 二叉树的递归,非递归遍历
- 递归 和 非递归 遍历二叉树
- 二叉树 递归 与 非递归 遍历
- 二叉树递归,非递归,前中后遍历
- 二叉树递归/非递归遍历
- 二叉树的递归+非递归遍历
- 二叉树遍历(层次,递归,非递归)
- 二叉树各种递归非递归遍历
- 二叉树遍历,递归,非递归
- 递归与非递归二叉树遍历
- 二叉树递归与非递归遍历
- VS2012版最常用的快捷键
- j2ee 连接数据库
- realloc,malloc,calloc的区别
- 如何在Linux里使用xargs命令
- UVA - 10048 Audiophobia (floyd+dp)
- 二叉树遍历(递归,非递归)
- 清仓极路由,源代码
- socket通信
- Evaluate Reverse Polish Notation --leetcode
- jsp监听器实现在线人数统计
- tcpDump包的解封读取(附源代码)
- C#3.0新特性之扩展方法介绍
- 关于vs2013中的BrowserLink问题
- poj 2570 Fiber Network floyd算法