首先我们需要知道的是二叉搜索树的特点:子节点比根节点小的都在根结点的左边,比根节点大的都在根节点的右边
需要定义一个节点类(内部静态类)用来记录左右节点以及节点上的数据
class BinarySortTree {
//二叉树的根节点
private Node root;
//元素个数
private int size;
//添加元素
public void add(int v) {
if (root == null) {
root = new Node(v);
size++;
System.out.println("添加了根元素:"+root.item);
}else {//不为空
//根添加子节点
if (root.addChild(v)) {
size++;
}
}
}
//中序遍历
public void middleList() {
root.printNode();
}
/**
* 节点类型
*/
static class Node {
//元素数据
private int item;
//左节点
private Node left;
//右节点
private Node right;
//构造方法
public Node(int item) {
this.item = item;
}
//添加孩子节点方法
public boolean addChild(int v) {
if (this.item > v){//v放在左边
if (this.left == null) {
//左边没有节点,创建新节点
this.left = new Node(v);
System.out.println(v+"放在"+this.item+"的左边");
}else {
//如果左边节点不为空,则递归循环判断
return this.left.addChild(v);
}
}else if (this.item < v) {//v放在右边
if (this.right == null) {
//右边没有节点,创建新节点
this.right = new Node(v);
System.out.println(v+"放在"+this.item+"的右边");
}else {
//如果右节点不为空,则递归循环判断
return this.right.addChild(v);
}
}else {
System.out.println(v+"重复元素");
return false;
}
return true;
}
//打印元素
public void printNode() {
//判断左边有没有元素 有则打印
if (this.left != null) {
this.left.printNode();
}
//打印元素
System.out.println(this.item);
//判断右边,如果有元素 打印
if (this.right != null) {
this.right.printNode();
}
}
}
}
主方法测试:
BinarySortTree bs = new BinarySortTree();
bs.add(15);
bs.add(2);
bs.add(56);
bs.add(20);
bs.add(45);
bs.add(45);
bs.add(8);
bs.add(12);
bs.middleList();
System.out.println();
System.out.println("元素个数:"+bs.getSize());
运行结果:
添加了根元素:15
2放在15的左边
56放在15的右边
20放在56的左边
45放在20的右边
45重复元素
8放在2的右边
12放在8的右边
2 8 12 15 20 45 56
元素个数:7