先看看实现了哪些功能吧?
(1)构造二叉树
(2)遍历二叉树结点
(3)搜索二叉树结点
(4)删除二叉树结点
(5)判断结点是否存在二叉树
看看源码:
package hk.inso.service;
/**
* Created by IntelliJ IDEA.
* Date: 8/17/15 11:45 PM
* Author: Richard
*/
public class BinarySearchTree {
/**
* 根结点,是所有遍历的入口
*/
private Node root = null;
private StringBuilder stringBuilder = new StringBuilder();
/**
* 插入一个元素
* @param value
*/
public void add( int value) {
Node node = new Node();
node.setValue(value);
insert(node);
}
/**
* 显示root
* @return
*/
public String getRoot() {
return "Root{ " + root. value + " }";
}
/**
* 移除一个特定的元素
* @param value
*/
public void remove( int value) {
Node node = new Node();
node.setValue(value);
delete(node);
}
/**
* 获取某个元素
* @param value
* @return
*/
public String get( int value) {
Node node = new Node();
node.setValue(value);
Node resultNode = search(node);
return "parent: " + resultNode. parent + " left: " +
resultNode. left + " right: " + resultNode. right;
}
/**
* 判断是否包含某个元素
* @param value
* @return
*/
public boolean contains( int value) {
Node node = new Node();
node.setValue(value);
Node resutlNode = search(node);
if (resutlNode == null) {
return false;
}
return true;
}
/**
* 先序遍历树,输出全部元素
* @return
*/
@Override
public String toString(){
//很重要,flush StringBuilder对象
stringBuilder = new StringBuilder();
StringBuilder sb = new StringBuilder();
sb.append( "BSTree{ ");
String midString = midTraverse( root);
//String midString = preTraverse(root);
//String midString = postTraverse(root);
int index = midString.lastIndexOf( ", ");
midString = midString.substring( 0, index);
sb.append(midString);
sb.append( " }");
return sb.toString();
}
/**
* 中序遍历树结构
* @param node
* @return
*/
private String midTraverse(Node node) {
if (node == null) {
return null;
}
midTraverse(node. left);
stringBuilder.append(node. value + ", ");
midTraverse(node. right);
return stringBuilder.toString();
}
/**
* 先序遍历树结构
* @param node
* @return
*/
private String preTraverse(Node node) {
if (node == null) {
return null;
}
stringBuilder.append(node. value + ", ");
preTraverse(node. left);
preTraverse(node. right);
return stringBuilder.toString();
}
/**
* 后序遍历树结构
* @param node
* @return
*/
private String postTraverse(Node node) {
if (node == null) {
return null;
}
postTraverse(node. left);
postTraverse(node. right);
stringBuilder.append(node. value + ", ");
return stringBuilder.toString();
}
/**
* 插入结点到二叉查找树
* @param node
*/
private void insert(Node node){
if ( root == null) {
root = node;
}
else {
boolean flag = true;
Node iteratorNode = root;
while (flag) {
//无子结点
if (iteratorNode. left == null && iteratorNode. right == null) {
appendNode(node, iteratorNode);
flag = false;
}
//有子结点
else {
//插入比当前结点小的结点
if (node. value < iteratorNode. value) {
if (iteratorNode. left == null) {
appendNode(node, iteratorNode);
flag = false;
} else {
iteratorNode = iteratorNode. left;
}
}
//插入比当前结点大的结点
else {
if (iteratorNode. right == null) {
appendNode(node, iteratorNode);
flag = false;
} else {
iteratorNode = iteratorNode. right;
}
}
}
}
}
};
/**
* 添加子结点
* @param node
* @param parent
*/
private void appendNode(Node node, Node parent) {
if (node. value < parent. value) {
parent. left = node;
node. parent = parent;
}
else {
parent. right = node;
node. parent = parent;
}
}
/**
* 删除结点
* @param node
*/
private void delete(Node node){
//找到该结点
Node resultNode = search(node);
if (resultNode. value == root. value) {
if (resultNode. left != null && resultNode. right != null) {
Node maxNode = getMaxNode(resultNode. left);
maxNode. right = resultNode. right;
resultNode. right. parent = maxNode;
root = resultNode. left;
} else if (resultNode. left == null && resultNode. right != null) {
root = resultNode. right;
} else if (resultNode. right == null && resultNode. left != null) {
root = resultNode. left;
} else if (resultNode. right == null && resultNode. left == null) {
root = null;
}
}
else if (resultNode. left == null && resultNode. right == null) {
if (resultNode.isLeft()) {
resultNode. parent. left = null;
}
else {
resultNode. parent. right = null;
}
}
else if (resultNode. left != null && resultNode. right == null) {
if (resultNode.isLeft()) {
resultNode. parent. left = resultNode. left;
}
else {
resultNode. parent. right = resultNode. left;
}
resultNode. left. parent = resultNode. parent;
}
else if (resultNode. left == null && resultNode. right != null) {
if (resultNode.isLeft()) {
resultNode. parent. left = resultNode. right;
}
else {
resultNode. parent. right = resultNode. right;
}
resultNode. right. parent = resultNode. parent;
}
/**
* 将当前结点的右孩子连接到左子树的最大子结点,并作为这个最大子结点的右孩子
*/
else if (resultNode. left != null && resultNode. right != null) {
if (resultNode.isLeft()) {
resultNode. left. parent = resultNode. parent;
resultNode. parent. left = resultNode. left;
Node maxNode = getMaxNode(resultNode. left);
maxNode. right = resultNode. right;
resultNode. right. parent = maxNode;
} else {
resultNode. left. parent = resultNode. parent;
resultNode. parent. right = resultNode. left;
Node maxNode = getMaxNode(resultNode. left);
maxNode. right = resultNode. right;
resultNode. right. parent = maxNode;
}
}
};
/**
* 查找某个元素
* @param node
* @return
*/
private Node search(Node node){
Node iteratorNode = root;
if (node == null || iteratorNode == null) {
return null;
}
boolean flag = true;
while (flag) {
if (node != null && iteratorNode != null && node. value < iteratorNode. value) {
if (iteratorNode.isLeaf()){
node = null;
flag = false;
}
else {
iteratorNode = iteratorNode. left;
}
}
if (node != null && iteratorNode != null && node. value > iteratorNode. value) {
if (iteratorNode.isLeaf()){
node = null;
flag = false;
}
else {
iteratorNode = iteratorNode. right;
}
}
//一定要分析清楚这个地方
if (node != null && iteratorNode != null && node. value == iteratorNode. value) {
node = iteratorNode;
flag = false;
}
if (iteratorNode == null || node == null) {
node = null;
flag = false;
}
}
return node;
};
/**
* 获取当前结点作为根的树下最小值的结点
* @param node
* @return
*/
private Node getMinNode(Node node) {
Node iteratorNode = node;
while (iteratorNode. left != null) {
iteratorNode = iteratorNode. left;
}
return iteratorNode;
}
/**
* 获取当前结点作为根的树下最大值的结点
* @param node
* @return
*/
private Node getMaxNode(Node node) {
Node iteratorNode = node;
while (iteratorNode. right != null) {
iteratorNode = iteratorNode. right;
}
return iteratorNode;
}
/**
* 内部类,树结点
*/
class Node{
private Node parent = null;
private Node left = null;
private Node right = null;
private int value = 0;
public Node(Node parent, Node left, Node right, int value) {
this. parent = parent;
this. left = left;
this. right = right;
this. value = value;
}
public Node() {
//constructor without args
}
public Node getParent() {
return parent;
}
public void setParent(Node parent) {
this. parent = parent;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this. left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this. right = right;
}
public int getValue() {
return value;
}
public void setValue( int value) {
this. value = value;
}
/**
* 是否为左孩子
* @return
*/
public boolean isLeft() {
if ( this. parent. left != null && this. value == this. parent. left. value) {
return true;
}
return false;
}
/**
* 是否为叶子结点
* @return
*/
public boolean isLeaf() {
if ( this. left == null && this. right == null) {
return true;
}
return false;
}
@Override
public String toString() {
return "Node{" +
"value=" + value +
"}";
}
}
/**
* Created by IntelliJ IDEA.
* Date: 8/17/15 11:45 PM
* Author: Richard
*/
public class BinarySearchTree {
/**
* 根结点,是所有遍历的入口
*/
private Node root = null;
private StringBuilder stringBuilder = new StringBuilder();
/**
* 插入一个元素
* @param value
*/
public void add( int value) {
Node node = new Node();
node.setValue(value);
insert(node);
}
/**
* 显示root
* @return
*/
public String getRoot() {
return "Root{ " + root. value + " }";
}
/**
* 移除一个特定的元素
* @param value
*/
public void remove( int value) {
Node node = new Node();
node.setValue(value);
delete(node);
}
/**
* 获取某个元素
* @param value
* @return
*/
public String get( int value) {
Node node = new Node();
node.setValue(value);
Node resultNode = search(node);
return "parent: " + resultNode. parent + " left: " +
resultNode. left + " right: " + resultNode. right;
}
/**
* 判断是否包含某个元素
* @param value
* @return
*/
public boolean contains( int value) {
Node node = new Node();
node.setValue(value);
Node resutlNode = search(node);
if (resutlNode == null) {
return false;
}
return true;
}
/**
* 先序遍历树,输出全部元素
* @return
*/
@Override
public String toString(){
//很重要,flush StringBuilder对象
stringBuilder = new StringBuilder();
StringBuilder sb = new StringBuilder();
sb.append( "BSTree{ ");
String midString = midTraverse( root);
//String midString = preTraverse(root);
//String midString = postTraverse(root);
int index = midString.lastIndexOf( ", ");
midString = midString.substring( 0, index);
sb.append(midString);
sb.append( " }");
return sb.toString();
}
/**
* 中序遍历树结构
* @param node
* @return
*/
private String midTraverse(Node node) {
if (node == null) {
return null;
}
midTraverse(node. left);
stringBuilder.append(node. value + ", ");
midTraverse(node. right);
return stringBuilder.toString();
}
/**
* 先序遍历树结构
* @param node
* @return
*/
private String preTraverse(Node node) {
if (node == null) {
return null;
}
stringBuilder.append(node. value + ", ");
preTraverse(node. left);
preTraverse(node. right);
return stringBuilder.toString();
}
/**
* 后序遍历树结构
* @param node
* @return
*/
private String postTraverse(Node node) {
if (node == null) {
return null;
}
postTraverse(node. left);
postTraverse(node. right);
stringBuilder.append(node. value + ", ");
return stringBuilder.toString();
}
/**
* 插入结点到二叉查找树
* @param node
*/
private void insert(Node node){
if ( root == null) {
root = node;
}
else {
boolean flag = true;
Node iteratorNode = root;
while (flag) {
//无子结点
if (iteratorNode. left == null && iteratorNode. right == null) {
appendNode(node, iteratorNode);
flag = false;
}
//有子结点
else {
//插入比当前结点小的结点
if (node. value < iteratorNode. value) {
if (iteratorNode. left == null) {
appendNode(node, iteratorNode);
flag = false;
} else {
iteratorNode = iteratorNode. left;
}
}
//插入比当前结点大的结点
else {
if (iteratorNode. right == null) {
appendNode(node, iteratorNode);
flag = false;
} else {
iteratorNode = iteratorNode. right;
}
}
}
}
}
};
/**
* 添加子结点
* @param node
* @param parent
*/
private void appendNode(Node node, Node parent) {
if (node. value < parent. value) {
parent. left = node;
node. parent = parent;
}
else {
parent. right = node;
node. parent = parent;
}
}
/**
* 删除结点
* @param node
*/
private void delete(Node node){
//找到该结点
Node resultNode = search(node);
if (resultNode. value == root. value) {
if (resultNode. left != null && resultNode. right != null) {
Node maxNode = getMaxNode(resultNode. left);
maxNode. right = resultNode. right;
resultNode. right. parent = maxNode;
root = resultNode. left;
} else if (resultNode. left == null && resultNode. right != null) {
root = resultNode. right;
} else if (resultNode. right == null && resultNode. left != null) {
root = resultNode. left;
} else if (resultNode. right == null && resultNode. left == null) {
root = null;
}
}
else if (resultNode. left == null && resultNode. right == null) {
if (resultNode.isLeft()) {
resultNode. parent. left = null;
}
else {
resultNode. parent. right = null;
}
}
else if (resultNode. left != null && resultNode. right == null) {
if (resultNode.isLeft()) {
resultNode. parent. left = resultNode. left;
}
else {
resultNode. parent. right = resultNode. left;
}
resultNode. left. parent = resultNode. parent;
}
else if (resultNode. left == null && resultNode. right != null) {
if (resultNode.isLeft()) {
resultNode. parent. left = resultNode. right;
}
else {
resultNode. parent. right = resultNode. right;
}
resultNode. right. parent = resultNode. parent;
}
/**
* 将当前结点的右孩子连接到左子树的最大子结点,并作为这个最大子结点的右孩子
*/
else if (resultNode. left != null && resultNode. right != null) {
if (resultNode.isLeft()) {
resultNode. left. parent = resultNode. parent;
resultNode. parent. left = resultNode. left;
Node maxNode = getMaxNode(resultNode. left);
maxNode. right = resultNode. right;
resultNode. right. parent = maxNode;
} else {
resultNode. left. parent = resultNode. parent;
resultNode. parent. right = resultNode. left;
Node maxNode = getMaxNode(resultNode. left);
maxNode. right = resultNode. right;
resultNode. right. parent = maxNode;
}
}
};
/**
* 查找某个元素
* @param node
* @return
*/
private Node search(Node node){
Node iteratorNode = root;
if (node == null || iteratorNode == null) {
return null;
}
boolean flag = true;
while (flag) {
if (node != null && iteratorNode != null && node. value < iteratorNode. value) {
if (iteratorNode.isLeaf()){
node = null;
flag = false;
}
else {
iteratorNode = iteratorNode. left;
}
}
if (node != null && iteratorNode != null && node. value > iteratorNode. value) {
if (iteratorNode.isLeaf()){
node = null;
flag = false;
}
else {
iteratorNode = iteratorNode. right;
}
}
//一定要分析清楚这个地方
if (node != null && iteratorNode != null && node. value == iteratorNode. value) {
node = iteratorNode;
flag = false;
}
if (iteratorNode == null || node == null) {
node = null;
flag = false;
}
}
return node;
};
/**
* 获取当前结点作为根的树下最小值的结点
* @param node
* @return
*/
private Node getMinNode(Node node) {
Node iteratorNode = node;
while (iteratorNode. left != null) {
iteratorNode = iteratorNode. left;
}
return iteratorNode;
}
/**
* 获取当前结点作为根的树下最大值的结点
* @param node
* @return
*/
private Node getMaxNode(Node node) {
Node iteratorNode = node;
while (iteratorNode. right != null) {
iteratorNode = iteratorNode. right;
}
return iteratorNode;
}
/**
* 内部类,树结点
*/
class Node{
private Node parent = null;
private Node left = null;
private Node right = null;
private int value = 0;
public Node(Node parent, Node left, Node right, int value) {
this. parent = parent;
this. left = left;
this. right = right;
this. value = value;
}
public Node() {
//constructor without args
}
public Node getParent() {
return parent;
}
public void setParent(Node parent) {
this. parent = parent;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this. left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this. right = right;
}
public int getValue() {
return value;
}
public void setValue( int value) {
this. value = value;
}
/**
* 是否为左孩子
* @return
*/
public boolean isLeft() {
if ( this. parent. left != null && this. value == this. parent. left. value) {
return true;
}
return false;
}
/**
* 是否为叶子结点
* @return
*/
public boolean isLeaf() {
if ( this. left == null && this. right == null) {
return true;
}
return false;
}
@Override
public String toString() {
return "Node{" +
"value=" + value +
"}";
}
}
}
测试代码:
public class TestBinarySearchTree {
private static BinarySearchTree binarySearchTree = new BinarySearchTree();
public static void main(String[] args) {
binarySearchTree.add( 14);
binarySearchTree.add( 20);
binarySearchTree.add( 7);
binarySearchTree.add( 11);
binarySearchTree.add( 19);
binarySearchTree.add( 2);
binarySearchTree.add( 44);
binarySearchTree.add( 32);
binarySearchTree.add( 4);
binarySearchTree.remove( 32);
System. out.println( binarySearchTree.toString());
System. out.println( binarySearchTree.contains( 32));
}
}
private static BinarySearchTree binarySearchTree = new BinarySearchTree();
public static void main(String[] args) {
binarySearchTree.add( 14);
binarySearchTree.add( 20);
binarySearchTree.add( 7);
binarySearchTree.add( 11);
binarySearchTree.add( 19);
binarySearchTree.add( 2);
binarySearchTree.add( 44);
binarySearchTree.add( 32);
binarySearchTree.add( 4);
binarySearchTree.remove( 32);
System. out.println( binarySearchTree.toString());
System. out.println( binarySearchTree.contains( 32));
}
}
结果:
BSTree{ 2, 4, 7, 11, 14, 19, 20, 44 }
false
以上源码所对应的结点的值均为Int型,如果你感兴趣,可以更改源码,扩展它的类型。以上代码均通过测试。