二叉树递归遍历和非递归遍历

来源:互联网 发布:java程序监听端口 编辑:程序博客网 时间:2024/05/18 09:28
递归遍历:
public void preOrder() {// TODO Auto-generated method stubSystem.out.print("先根次序遍历二叉树:");preOrder(root);System.out.println();}public void preOrder(BinaryNode<T> p) {if (p != null) {System.out.print(p.data.toString() + " ");preOrder(p.left);preOrder(p.right);}}@Overridepublic void inOrder() {// TODO Auto-generated method stubSystem.out.print("中根次序遍历二叉树:");inOrder(root);System.out.println();}public void inOrder(BinaryNode<T> p) {if (p != null) {inOrder(p.left);System.out.print(p.data.toString() + " ");inOrder(p.right);}}@Overridepublic void postOrder() {// TODO Auto-generated method stubSystem.out.print("后根次序遍历二叉树:");postOrder(root);System.out.println();}public void postOrder(BinaryNode<T> p) {if (p != null) {postOrder(p.left);postOrder(p.right);System.out.print(p.data.toString() + " ");}}

非递归遍历

public void inOrderTraverse() {System.out.println("中根次序遍历(非递归):");Stack<BinaryNode<T>> stack = new Stack<BinaryNode<T>>();BinaryNode<T> p = this.root;while (p != null || !stack.isEmpty()) {if (p != null) {stack.push(p);p = p.left;} else {p = stack.pop();System.out.println(p.data + " ");p = p.right;}}}public void preOrderTaverse() {System.out.println("先根次序遍历(非递归):");Stack<BinaryNode<T>> stack = new Stack<BinaryNode<T>>();BinaryNode<T> p = this.root;while (p != null || !stack.isEmpty()) {if (p != null) {System.out.println(p.data + " ");stack.push(p);p = p.left;} else {p = stack.pop();p = p.right;}}}public void postOrderTaverse() {System.out.println("后根次序遍历(非递归):");Stack<BinaryNode<T>> stack = new Stack<BinaryNode<T>>();BinaryNode<T> p = this.root;BinaryNode<T> q = null;while (p != null || !stack.isEmpty()) {// 所有的左子结点相继入栈,除了最后一个while (p.left != null) {stack.push(p);p = p.left;}// 当前节点无右子结点或右子结点已经输出,就输出当前节点while (p.right == null || p.right == q) {System.out.print(p.data + " ");q = p;if (stack.isEmpty())return;p = stack.pop();}// 处理右子结点stack.push(p);p = p.right;}