<html>
先看看实现了哪些功能吧?
(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型。假设你感兴趣,能够更改源代码,扩展它的类型。以上代码均通过測试。
版权声明:本文为博主原创文章。未经博主同意不得转载。
举报
- 本文已收录于下面专栏:
相关文章推荐
-
树形结构_数据库_利用递归遍历一棵仅仅知道父节点的树
遍历一棵仅仅知道父节点的树- u010003835
- 2016-02-26 10:38
- 1929
-
【树形递归】
C#树形递归,部门树状图 假设数据库中存在的department部门表,当中ID为主键,PID为父类,Name为部门名称,设计例如以下: public class department {...- heyangyi_19940703
- 2016-05-20 16:25
- 1370
-
二叉树查找树的基本操作
一、什么是二叉查找树: 顾名思义,一棵二叉查找树是以一棵树的形式组织起来的,如图一所看到的。其能够使用一个链表数据结构来表示, 当中每一个节点就是就是一个对象。除了包括数据域之外还包括属性lch...- heart_love
- 2016-03-21 10:21
- 2237
-
查找之二叉树查找
1. 查找树的创建(createTree) 如果有例如以下数组4,1,45,78,345,23,12,3,6,21 首先选定4为root。然后遍历剩下的数字,假设大于等于4则放到4的右側。小...- TODD911
- 2013-01-06 09:43
- 19526
-
创建搜索二叉树
二叉搜索树:对于树中的每一个节点,它的左子树中全部节点的值都小于父结点,右子树全部值都大于父结点。 创建实现: #include #include #include using namespace ...- xiaocherry1128
- 2017-07-31 11:38
- 20
-
找到二叉树中的最大搜索二叉树
题目 给定一颗二叉树。已知当中全部节点的值都不一样,找到含有节点最多的二叉搜索树。并返回头节点。 注:一个二叉树的子树的叶节点必须是该二叉树的叶节点。解答:...
- u010005161
- 2016-09-14 17:51
- 352
-
具体解释二叉查找树算法的实现
參考文献: 《数据结构(C语言版)》 严蔚敏 吴伟民 编著 开发平台:Ubuntu11.04 编译器:gcc version4.5.2 (Ubuntu/Linaro 4.5...- npy_lp
- 2012-04-06 13:32
- 59394
-
搜索二叉树
二叉树的基本问题: 二叉树是递归定义的,因此相关问题基本都能够用递归实现。递归在本质上就是一个栈。二叉搜索树:对于树中的每一个节点X,它的左子树中全部项的值都小于X,右子树全部值都大于X。 定义一...
- u010293702
- 2015-04-06 17:09
- 556
-
Matlab代码实现SOM(自组织映射)算法
som可用于聚类。图像切割等,因为论文须要matlab实现了som。%som实现 %2016-11-12 %by wangbaojia % som原理及參数说明 % 1.竞争:匹配最佳神经元----...
- bwangk
- 2016-11-23 09:03
- 3490
收藏助手
不良信息举报
posted on 2017-08-15 17:46 cynchanpin 阅读(646) 评论(0) 编辑 收藏 举报
0条评论