前序遍历
若树为空,则空操作返回。否则,先访问根节点,然后前序遍历左子树,再前序遍历右子树。(中 左 右)
中序遍历
若树为空,则空操作返回。否则,从根节点开始(注意并不是先访问根节点),中序遍历根节点的左子树,然后是访问根节点,最后中序遍历根节点的右子树。(左 中 右)
后续遍历
若树为空,则空操作返回。否则,从左到右先叶子后节点的方式遍历访问左右子树,最后访问根节点。(左 右 中)
层序遍历
若树为空,则空操作返回。否则,从树的第一层,也就是根节点开始访问,从上到下逐层遍历,在同一层中,按从左到右的顺序结点逐个访问。
/**
* 前序遍历BST树的API接口
*/
public void preOrder(){
System.out.print(“递归前序遍历:”);
preOrder(this.root);
System.out.println();
}
/**
* 前序遍历BST树的递归操作 VLR
* @param root
*/
private void preOrder(BSTNode<T> root) {
if(root != null){
System.out.print(root.getData() + " ");
preOrder(root.getLeft());
preOrder(root.getRight());
}
}
/**
* 中序遍历BST树的API接口
*/
public void inOrder(){
System.out.print("递归中序遍历:");
inOrder(this.root);
System.out.println();
}
/**
* 中序遍历BST树的递归操作 LVR
* @param root
*/
private void inOrder(BSTNode<T> root) {
if(root != null){
inOrder(root.getLeft());
System.out.print(root.getData() + " ");
inOrder(root.getRight());
}
}
/**
* 后序遍历BST树的API接口
*/
public void postOrder(){
System.out.print("递归后序遍历:");
postOrder(this.root);
System.out.println();
}
/**
* 中序遍历BST树的递归操作 LRV
* @param root
*/
private void postOrder(BSTNode<T> root) {
if(root != null){
postOrder(root.getLeft());
postOrder(root.getRight());
System.out.print(root.getData() + " ");
}
}
/**
* 层序遍历BST树的API接口
*/
public void levelOrder(){
System.out.print("递归层序遍历:");
int hight = level();
for (int i = 0; i < hight; i++) {
levelOrder(this.root, i);
}
System.out.println();
}
/**
* 层序遍历的递归实现
* @param root
* @param i
*/
private void levelOrder(BSTNode<T> root, int i) {
if(root != null){
if(i == 0){
System.out.print(root.getData() + " ");
return;
}
levelOrder(root.getLeft(), i-1);
levelOrder(root.getRight(), i-1);
}
}
/**
* 返回BST树中所有节点个数的API
* @return
*/
public int number(){
return number(this.root);
}
/**
* 以root为根节点计算BST树的节点个数
* @param root
* @return
*/
private int number(BSTNode<T> root) {
if(root == null){
return 0;
} else {
return number(root.getLeft()) + number(root.getRight()) + 1;
}
}
/**
* 返回BST树的高度/层数的API
* @return
*/
public int level(){
return level(this.root);
}
/**
* 计算以root为根节点的BST树的高度
* @param root
* @return
*/
private int level(BSTNode<T> root) {
if(root == null){
return 0;
} else {
int left = level(root.getLeft());
int right = level(root.getRight());
return left > right ? left+1 : right+1;
}
}