二叉树遍历(递归,非递归)

来源:互联网 发布:小脑袋调价软件 编辑:程序博客网 时间: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