一、定义
1、一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的结点。
二、基础代码
1、先定义一个节点类,包括左节点、右节点、值三个实例变量。
public class Node { private Node leftNode; private Node rightNode; private int value; public Node(int value) { this.value = value; } }
2、定义一个二叉排序树类,包括根节点。
public class BinarySortTree { private Node root; }
3、开发测试类,用于测试。
(1)测试类中我们定义类一个arr数组,使用for循环生成节点添加到树中,该add()方法的下面会讲到。
public class Test { public static void main(String[] args) { int[] arr = new int[]{7, 3, 10, 12, 5, 1, 9}; BinarySortTree tree = new BinarySortTree(); for (int i : arr) { tree.addNode(new Node(i)); } } }
三、插入节点
1、实现思路:
在二叉排序树中肯定需要一个add方法来添加节点,如果是一颗空树,我们直接将节点添加到根节点就行了,如果不是空树,我们肯定得递归调用节点的add方法了,因为根据二叉排序数的概念,左叶子节点的值<父节点的值<右节点的值,所以我们每次拿到当前节点,都需要判断当前节点与添加节点的值,看往左节点添加还是右节点添加,递归下去,只到找到要添加节点的位置为空时,递归停止,直接将节点添加。
2、代码如下:
(1)树类的add()方法
public void addNode(Node node) { if (root == null) { root = node; } else { root.add(node); } }
(2)节点类的add()方法
public void add(Node node) { if (node == null) { return; } if (this.value > node.value) { if (this.leftNode == null) { this.leftNode = node; } else { this.leftNode.add(node); } } else { if (this.rightNode == null) { this.rightNode = node; } else { this.rightNode.add(node); } } }
四、遍历排序二叉树
上面我们实现了添加节点,接下来实现排序二叉树的遍历,根据定义和插入节点可知,要想得到一个有序的遍历,只有中序排序才能实现,因为中序遍历是按照左节点,然后父节点,最后右节点的顺序遍历,我们插入就是实现了左节点值<父节点值<右节点。如果使用前序或者后序遍历,出来的就无序了。
1、在树类中添加遍历方法
(1)遍历时,我们需要先判断根节点是否为空,如果为空,直接返回即可,不为空再调用节点类的排序方法。
public void middleSort() { if (root == null) { return; } root.middleSort(); }
2、在节点类中添加遍历方法
(1)先判断左节点是否有值,如果有,我们就让左节点接着调用遍历方法,只到左节点为空了,我们打印当前节点的值,当前节点就是父节点,然后再判断右节点,不为空就递归调用。
public void middleSort() { if (this.leftNode != null) { this.leftNode.middleSort(); } System.out.println(this.value); if (this.rightNode != null) { this.rightNode.middleSort(); } }