二叉搜索树算法详解与Java实现
来源:互联网 发布:软件著作权怎么申请 编辑:程序博客网 时间:2024/06/05 10:42
struct
celltype{ records data;
celltype * lchild, * rchild;
}
typedef
celltype * BST;
package wx.algorithm.search.bst;
/**
* Created by apple on 16/7/29.
*/
/**
* @function 二叉搜索树中的节点
*/
public
class
Node {
//存放节点数据
int
data;
//指向左子节点
Node left;
//指向右子节点
Node right;
/**
* @function 默认构造函数
* @param data 节点数据
*/
public
Node(
int
data) {
this
.data = data;
left = null;
right = null;
}
}
查找
BST Search(keytype k, BST F){
//在F所指的二叉查找树中查找关键字为k的记录。若成功,则返回响应结点的指针,否则返回空
if
(F == NULL)
//查找失败
return
NULL;
else
if
(k == F -> data.key){
//查找成功
return
F;
}
else
if
(k < F -> data.key){
//查找左子树
return
Search(k,F -> lchild);
}
else
if
(k > F -> data.key){
//查找右子树
return
Search(k,F -> rchild);
}
}
插入
void
Insert(records R, BST &F){
//在F所指的二叉查找树中插入一个新纪录R
if
(F == NULL){
F =
new
celltype;
F -> data = R;
F -> lchild = NULL;
F -> rchild = NULL;
}
else
if
(R.key < F -> data.key){
Insert(R,F -> lchild);
}
else
if
(R.key > F -> data.key){
Insert(R,F -> rchild);
}
//如果 R.key == F -> data.key 则返回
}
删除
删除叶节点
删除只有一个子节点的内部节点
删除有两个子节点的内部节点
Java 实现
package
wx.algorithm.search.bst;
/**
* Created by apple on 16/7/29.
*/
/**
* @function 二叉搜索树的示范代码
*/
public
class
BinarySearchTree {
//指向二叉搜索树的根节点
private
Node root;
//默认构造函数
public
BinarySearchTree() {
this
.root =
null
;
}
/**
* @param id 待查找的值
* @return
* @function 默认搜索函数
*/
public
boolean
find(
int
id) {
//从根节点开始查询
Node current = root;
//当节点不为空
while
(current !=
null
) {
//是否已经查询到
if
(current.data == id) {
return
true
;
}
else
if
(current.data > id) {
//查询左子树
current = current.left;
}
else
{
//查询右子树
current = current.right;
}
}
return
false
;
}
/**
* @param id
* @function 插入某个节点
*/
public
void
insert(
int
id) {
//创建一个新的节点
Node newNode =
new
Node(id);
//判断根节点是否为空
if
(root ==
null
) {
root = newNode;
return
;
}
//设置current指针指向当前根节点
Node current = root;
//设置父节点为空
Node parent =
null
;
//遍历直到找到第一个插入点
while
(
true
) {
//先将父节点设置为当前节点
parent = current;
//如果小于当前节点的值
if
(id < current.data) {
//移向左节点
current = current.left;
//如果当前节点不为空,则继续向下一层搜索
if
(current ==
null
) { parent.left = newNode;
return
;
}
}
else
{
//否则移向右节点
current = current.right;
//如果当前节点不为空,则继续向下一层搜索
if
(current ==
null
) { parent.right = newNode;
return
;
}
}
}
}
/**
* @param id
* @return
* @function 删除树中的某个元素
*/
public
boolean
delete(
int
id) {
Node parent = root;
Node current = root;
//记录被找到的节点是父节点的左子节点还是右子节点
boolean
isLeftChild =
false
;
//循环直到找到目标节点的位置,否则报错
while
(current.data != id) { parent = current;
if
(current.data > id) {
isLeftChild =
true
;
current = current.left;
}
else
{
isLeftChild =
false
;
current = current.right;
}
if
(current ==
null
) {
return
false
;
}
}
//如果待删除的节点没有任何子节点
//直接将该节点的原本指向该节点的指针设置为null
if
(current.left ==
null
&& current.right ==
null
) {
if
(current == root) {
root =
null
;
}
if
(isLeftChild ==
true
) { parent.left =
null
;
}
else
{ parent.right =
null
;
}
}
//如果待删除的节点有一个子节点,且其为左子节点
else
if
(current.right ==
null
) {
//判断当前节点是否为根节点
if
(current == root) {
root = current.left;
}
else
if
(isLeftChild) {
//挂载到父节点的左子树
parent.left = current.left;
}
else
{
//挂载到父节点的右子树
parent.right = current.left;
}
}
else
if
(current.left ==
null
) {
if
(current == root) {
root = current.right;
}
else
if
(isLeftChild) { parent.left = current.right;
}
else
{ parent.right = current.right;
}
}
//如果待删除的节点有两个子节点
else
if
(current.left !=
null
&& current.right !=
null
) {
//寻找右子树中的最小值
Node successor = getSuccessor(current);
if
(current == root) {
root = successor;
}
else
if
(isLeftChild) { parent.left = successor;
}
else
{ parent.right = successor;
}
successor.left = current.left;
}
return
true
;
}
/**
* @param deleleNode
* @return
* @function 在树种查找最合适的节点
*/
private
Node getSuccessor(Node deleleNode) {
Node successsor =
null
;
Node successsorParent =
null
;
Node current = deleleNode.right;
while
(current !=
null
) {
successsorParent = successsor;
successsor = current;
current = current.left;
}
if
(successsor != deleleNode.right) {
successsorParent.left = successsor.right;
successsor.right = deleleNode.right;
}
return
successsor;
}
/**
* @function 以中根顺序遍历树
*/
public
void
display() {
display(root);
}
private
void
display(Node node) {
//判断当前节点是否为空
if
(node !=
null
) {
//首先展示左子树
display(node.left);
//然后展示当前根节点的值
System.out.print(
" "
+ node.data);
//最后展示右子树的值
display(node.right);
}
}
}
package
wx.algorithm.search.bst;
import
org.junit.Before;
import
org.junit.Test;
/**
* Created by apple on 16/7/30.
*/
public
class
BinarySearchTreeTest {
BinarySearchTree binarySearchTree;
@Before
public
void
setUp() {
binarySearchTree =
new
BinarySearchTree();
binarySearchTree.insert(
3
);
binarySearchTree.insert(
8
);
binarySearchTree.insert(
1
);
binarySearchTree.insert(
4
);
binarySearchTree.insert(
6
);
binarySearchTree.insert(
2
);
binarySearchTree.insert(
10
);
binarySearchTree.insert(
9
);
binarySearchTree.insert(
20
);
binarySearchTree.insert(
25
);
binarySearchTree.insert(
15
);
binarySearchTree.insert(
16
);
System.out.println(
"原始的树 : "
);
binarySearchTree.display();
System.out.println(
""
);
}
@Test
public
void
testFind() {
System.out.println(
"判断4是否存在树中 : "
+ binarySearchTree.find(
4
));
}
@Test
public
void
testInsert() {
}
@Test
public
void
testDelete() {
System.out.println(
"删除值为2的节点 : "
+ binarySearchTree.delete(
2
));
binarySearchTree.display();
System.out.println(
"\n 删除有一个子节点值为4的节点 : "
+ binarySearchTree.delete(
4
));
binarySearchTree.display();
System.out.println(
"\n 删除有两个子节点的值为10的节点 : "
+ binarySearchTree.delete(
10
));
binarySearchTree.display();
}
}
0 0
- 二叉搜索树算法详解与Java实现
- 数据结构与算法分析笔记与总结(java实现)--二叉树22:二叉搜索树与双向链表
- 《数据结构与算法分析》搜索二叉树详解
- 数据结构与算法分析笔记与总结(java实现)--二叉树20:二叉搜索树的后序遍历序列
- 数据结构与算法分析笔记与总结(java实现)--二叉树21:二叉搜索树的第k个结点
- 数据结构与算法分析笔记与总结(java实现)--二叉树10:最大二叉搜索子树练习题
- 二叉搜索树详解链式与数组式实现
- BinarySearchTree Implements(Java 实现的二叉搜索树算法)
- 算法java实现--动态规划--最优二叉树搜索
- Java实现 二叉搜索树算法(BST)
- Java实现 二叉搜索树算法(BST)
- Java实现 二叉搜索树算法(BST)
- Java与算法之(13) - 二叉搜索树
- java实现二叉搜索树
- Java实现二叉搜索树
- Java实现二叉搜索树
- Java实现二叉搜索树
- 二叉搜索树JAVA实现
- Jenkins java进程监控
- Two Sum
- linux iptables开放端口命令
- 【magento2命令行安装 WINDOWS】[UnexpectedValueException] The checksum verification of the file failed (down
- python学习笔记(四)
- 二叉搜索树算法详解与Java实现
- HTTP协议之Content-Encoding
- OpenWrt增加软件包
- 给新手的最佳类Windows界面的Linux发行版
- 十九、UI-Grid 水平滚动
- RN基础以及组件学习技巧
- 1002. 写出这个数 (20)
- Typescript结合gulp开发
- Java反射在JVM的实现