二分搜索树的特点
1.二分搜索树的每一个节点的值大于其左子树的所有节点的值,并且小于其右子树的所有节点的值
2.每一颗子树也是二分搜索树
3.因为它的存储是有序的,存储的元素必须具有可比较性
树结构的遍历方法
前序遍历:先遍历根结点,再遍历左子树,最后遍历右子树。
中序遍历:先遍历左子树,再遍历根结点,最后遍历右子树,遍历结果从小到大有序排列
后序遍历:先遍历左子树,再遍历右子树,最后遍历根结点
如图:
前序遍历为:ABCDEFG
中序遍历为:CBDAEGF
后序遍历为:CDBGFEA
代码实现
public class UniTree<E extends Comparable<E>> {
//根节点
private Node root;
private int size;
private class Node {
private E e;
private Node left; //左节点
private Node right; //右节点
public Node() {}
public Node(E e) {
this.e = e;
}
}
//添加元素
public void add(E e) {
if (root == null) {
root = new Node(e);
} else {
Node temp = root;
while (temp != null) {
if (e.compareTo(temp.e) > 0) {
if (temp.right == null) {
temp.right = new Node(e);
break;
}
temp = temp.right;
}
if (e.compareTo(temp.e) < 0) {
if (temp.left == null) {
temp.left = new Node(e);
break;
}
temp = temp.left;
}
}
}
size++;
}
//前序遍历
public void preOrder() {
preOrder(root);
}
private void preOrder(Node node) {
if (node == null) {
return;
}
System.out.println(node.e);
preOrder(node.left);
preOrder(node.right);
}
中序遍历
public void inOrder() {
inOrder(root);
}
private void inOrder(Node node) {
if (node == null) {
return;
}
preOrder(node.left);
System.out.println(node.e);
preOrder(node.right);
}
//后续遍历
public void postOrder() {
postOrder(root);
}
private void postOrder(Node node) {
if (node == null) {
return;
}
preOrder(node.left);
preOrder(node.right);
System.out.println(node.e);
}
}