之所以叫前序遍历是因为先访问左子树,之后遍历右子树,由于前序遍历的输出结果能完整的反应二分树的结构,所以一般使用前序遍历
/**
* 二分搜索树,传入的泛型必须实现Comparable接口,保证具有可比较性
*/
public class BinarySearchTree<E extends Comparable<E>> {
private Node root;//根节点
private Integer size = 0;
/**
* 二分搜索树的前序遍历
*/
public void preOrder() {
this.preOrder(root);
}
/**
* 前序遍历二分搜索树
* 由于Node是内部类以及递归的特殊性设置为private
*
* @param node
*/
private void preOrder(Node node) {
if (node == null)
return;
System.out.println(node.e);
this.preOrder(node.left);
this.preOrder(node.right);
}
/**
* 用内部类屏蔽具体的实现细节
*/
private class Node {
public E e;
public Node left, right;
public Node(E e) {
this.e = e;
left = null;
right = null;
}
}
}
中序遍历和前序遍历的区别在于访问该节点的值的先后,中序遍历输出的值是从小到大排序的。
package blacktv.bst;
/**
* 二分搜索树,传入的泛型必须实现Comparable接口,保证具有可比较性
*/
public class BinarySearchTree<E extends Comparable<E>> {
private Node root;//根节点
private Integer size = 0;
/**
* 二分搜索树的中序遍历入口
*/
public void inOrder() {
this.inOrder(root);
}
/**
* 中序遍历的递归方法
* 由于Node是内部类以及递归的特殊性设置为private
* @param node
*/
private void inOrder(Node node) {
if (node == null)
return;
this.inOrder(node.left);
System.out.println(node.e);
this.inOrder(node.right);
}
/**
* 用内部类屏蔽具体的实现细节
*/
private class Node {
public E e;
public Node left, right;
public Node(E e) {
this.e = e;
left = null;
right = null;
}
}
}
前序遍历和中序遍历的对比:
/**
* 二分搜索树后续遍历的入口
*/
public void postOrder() {
this.preOrder(root);
}
/**
* 二分搜索树后续遍历的递归方法
* 由于Node是内部类以及递归的特殊性设置为private
*
* @param node
*/
private void postOrder(Node node) {
if (node == null)
return;
this.postOrder(node.left);
this.postOrder(node.right);
System.out.println(node.e);
}