二叉树的递归遍历和非递归遍历
public class Node {
private char value;
private Node leftChild;
private Node rightChild;
public Node(char value) {
super();
this.value = value;
}
public char getValue() {
return value;
}
public void setValue(char value) {
this.value = value;
}
public Node getLeftChild() {
return leftChild;
}
public void setLeftChild(Node leftChild) {
this.leftChild = leftChild;
}
public Node getRightChild() {
return rightChild;
}
public void setRightChild(Node rightChild) {
this.rightChild = rightChild;
}
}
public interface NonRecursiveTraverse {
void traverse(Node root);
}
public interface RecursiveTraverse {
void tranverse(Node node);
}
先序遍历
递归
public class PreOrderTraverse implements RecursiveTraverse {
@Override
public void tranverse(Node node) {
// TODO Auto-generated method stub
if (node == null) {
return;
}
System.out.println(node.getValue());
tranverse(node.getLeftChild());
tranverse(node.getRightChild());
}
}
非递归
public class PreOrderTraverse implements NonRecursiveTraverse {
private Stack<Node> stack;
public PreOrderTraverse() {
// TODO Auto-generated constructor stub
stack = new Stack<Node>();
}
@Override
public void traverse(Node root) {
// TODO Auto-generated method stub
Node node1 = root;
Node node2 = null;
while (node1 != null || !stack.isEmpty()) {
if (node1 != null) {
System.out.println(node1.getValue());
stack.push(node1);
node1 = node1.getLeftChild();
} else {
//左子树为空时,遍历右子树
node2 = stack.pop();
node1 = node2.getRightChild();
}
}
}
}
中序遍历
递归
public class InOrderTraverse implements RecursiveTraverse {
@Override
public void tranverse(Node node) {
// TODO Auto-generated method stub
if (node == null) {
return;
}
tranverse(node.getLeftChild());
System.out.println(node.getValue());
tranverse(node.getRightChild());
}
}
非递归
public class InOrderTraverse implements NonRecursiveTraverse {
private Stack<Node> stack;
public InOrderTraverse() {
// TODO Auto-generated constructor stub
stack = new Stack<Node>();
}
@Override
public void traverse(Node root) {
// TODO Auto-generated method stub
Node node1 = root;
Node node2 = null;
while (node1 != null || !stack.isEmpty()) {
if (node1 != null) {
stack.push(node1);
node1 = node1.getLeftChild();
} else {
//左子树为空时,遍历右子树
node2 = stack.pop();
System.out.println(node2.getValue());
node1 = node2.getRightChild();
}
}
}
}
后序遍历
递归
public class PostOrderTraverse implements RecursiveTraverse {
@Override
public void tranverse(Node node) {
// TODO Auto-generated method stub
if (node == null) {
return;
}
tranverse(node.getLeftChild());
tranverse(node.getRightChild());
System.out.println(node.getValue());
}
}
非递归
public class PostOrderTraverse implements NonRecursiveTraverse {
private Stack<Node> stack;
public PostOrderTraverse() {
// TODO Auto-generated constructor stub
stack = new Stack<Node>();
}
@Override
public void traverse(Node root) {
// TODO Auto-generated method stub
Node node1 = root;
Node node2 = null;
while (node1 != null || !stack.isEmpty()) {
if (node1 != null) {
stack.push(node1);
node1 = node1.getLeftChild();
} else {
node2 = stack.peek();
if (node2.getRightChild() == null) {
//当前节点为叶子节点时,回溯输出
node2 = traceback();
}
node1 = (node2 == null ? null : node2.getRightChild());
}
}
}
private Node traceback() {
Node node = null;
do {
node = stack.pop();
System.out.println(node.getValue());
//循环结束的条件:当前节点不是父节点的右孩子节点,即左孩子节点
} while (!stack.isEmpty() && (stack.peek().getRightChild() == node));
if (stack.isEmpty()) {
node = null;
} else {
node = stack.peek();
}
return node;
}
}