/* * 二叉查找树(binary search/sort tree,BST)是具有如下性质的二叉树:对于二叉树中的任意一个结点, * 如果它包含的数据元素为data,那么它的左子树(如果非空)只包含小于data的元素,并且它的右子树 * (如果非空)只包含大于或者等于data的元素。它是一种动态树表,树结构在插入元素时生成。 * * */ public class BSTree { // 假设结点值为整数 private static class BSTNode { private int value; private BSTNode left; private BSTNode right; public BSTNode() { } public BSTNode(int value) { this.value = value; } public int getvalue() { return value; } public void setvalue(int value) { this.value = value; } public BSTNode getLeft() { return left; } public void setLeft(BSTNode left) { this.left = left; } public BSTNode getRight() { return right; } public void setRight(BSTNode right) { this.right = right; } } private BSTNode root; private int size; // 构造空二叉树 public BSTree() { clear(); } // 构造只有一个节点的二叉树 public BSTree(int value) { root = new BSTNode(value); } public final void clear() { // 不可覆写 root = null; this.size = 0; } /* * node:二叉树上的一个节点 * value:要操作的数据 * * */ public BSTNode insert(BSTNode node, int value) { if (node == null) { size++; if (root == null) { // 是否是空二叉树,根节点有些特殊,它没有父节点也是二叉树的起点 root = new BSTNode(value); return root; } return new BSTNode(value); } else { if (value < node.value) { node.left = insert(node.left, value); } else { node.right = insert(node.right, value); } } return node; } // 直接插入二叉树,自动寻找到插入位置 public void insert(int value) { insert(root, value); } private BSTNode search(BSTNode node, int value) { if(node == null) { return null; } else { if(value == node.value) { return node; } else if(value < node.value){ return search(node.left, value); } else { return search(node.right, value); } } } public boolean contains(int value) { return (search(root, value) != null); } /* * 前序:根-左-右 * 中序:左-根-右,将会得到从小到大排列的结点序列 * 后序:左-右-根 * * */ private void midList(BSTNode node) { if (node.left != null) { midList(node.left); } System.out.print(node.value + ","); if (node.right != null) { midList(node.right); } } public void midList() { midList(root); } // 逆中序(右-根-左)打印,打印后的结果顺时针旋转90°就是正常的二叉树形状了 /* * @param * node: 打印的节点 * depth: 打印节点的深度 * */ private void print(BSTNode node, final int depth) { if(node == null) { return; } print(node.right,depth+1); // 注意这里不能用depth++或++depth for(int i = 0; i < depth; i++) { System.out.print(" "); } System.out.println(node.value); print(node.left,depth+1); } // 打印二叉树 public void print(){ print(root,0); } public int size() { return size; } }
public class BSTreeTest { /** * @param args */ public static void main(String[] args) { BSTree bst = new BSTree(); int[] array = new int[] {6,4,9,1,8,3,10}; for(int i : array) { bst.insert(i); } System.out.println(bst.contains(1)); bst.midList(); // bst.print(); } }