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

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;
}
}

posted on 2012-05-09 19:51  咖啡崽  阅读(246)  评论(0编辑  收藏  举报

导航