二叉树是一种非线性的结构
作为二叉树,其最多只有两个子树
本篇博客介绍的二叉搜索树,是使用最多的二叉树之一
二叉搜索树的特点:
1. 二叉搜索树每个节点的值大于左子树所有节点的值,小于其右子树所有节点的值
2. 不含重复元素
3. 元素具有可比较性
/** 既然要实现“比较”的功能
那么,应实现两个接口(“或”的关系):
Comparable:作内部比较,方法为 compareTo
Comparator:作外部比较
下面将以简单的例子,来说明二叉搜索树的特性:
请以二叉搜索树的形式排列以下元素:
5、1、8、3、4、7、9
依据上面我们给出的二叉搜索树的特点,我们对以上一列元素进行排列,得出结果如图所示:
下面将介绍二叉树的三种遍历方式(前、中、后序进行遍历)
所谓二叉树的遍历,即:
按照相应的规则将二叉树中每个节点访问一次
所谓的 “序” —— 每个子树根节点的访问顺序
1. 前序
先 访问一个节点的根节点
再 访问左子树
最后 访问右子树
依照前序的特点进行遍历,那么输出结果应为 ——
28、16、13、22、30、29、42
2. 中序
先 访问左子树
再 访问一个节点的根节点
最后 访问右子树
依照中序的特点进行遍历,那么输出结果应为 ——
13、16、22、28、29、30、42
其实,通过输出结果来看,
我们观察到:中序的输出结果其实就是二叉搜索树排序后的结果
3. 后序
先 访问左子树
再 访问右子树
最后 访问一个节点的根节点
依照后序的特点进行遍历,那么输出结果应为 ——
13、22、16、29、42、30、28
最后给出代码实现(递归)
public class BinSearchTree<E extends Comparable<E>> implements BinTree<E> {
// Node类的声明
private class Node {
E data;
Node left;
Node right;
public Node(E data) {
this.data = data;
}
}
private Node root; // 根节点
private int size; // 二叉树节点个数
@Override
public void preOrder() {
preOrder(root);
}
/**
* 以当前节点作为根节点进行 前序 遍历:根左右
* @param node
*/
private void preOrder(Node node) {
if (node == null) {
return; // 当前节点为空
}
System.out.println(node.data); // 当前节点不为空,直接输出
preOrder(node.left);
preOrder(node.right);
}
//****************************************************************
@Override
public void inOrder() {
inOrder(root);
}
/**
* 以 node为根节点进行 中序 遍历:左根右
* @param node
*/
private void inOrder(Node node) {
if(node == null) {
return;
}
inOrder(node.left);
System.out.println(node.data);
inOrder(node.right);
}
//****************************************************************
@Override
public void postOrder() {
postOrder(root);
}
/**
* 以 node为根节点进行 后序 遍历:左右根
* @param node
*/
private void postOrder(Node node) {
if (node == null) {
return;
}
postOrder(node.left);
postOrder(node.right);
System.out.println(node.data);
}
}