Java实现二叉搜索树及相关操作
package com.tree;
import com.tree.BitNode;
/**
*
* 二叉搜索树:一个节点的左子节点的关键字小于这个节点。右子节点的关键字大于或等于这个父节点
*
* 注意:不适合插入同样关键字的节点
与平衡二叉树比較:不适合插入有序序列
*/
public class SearchBinTree {
public static void main(String[] args) {
BitNode root = new BitNode();
root.data = 6;
int[] arr = { 1, 3, 9, 7, 0, 4 };
for (int i = 0; i < arr.length; i++) {
insert(root, arr[i]);
}
BinTree.levelTraverse(root);
BitNode successor = getSuccessor(root);
System.out.println("successor:" + successor.data);
System.out.println("delete : " + delete(root, 1));
BinTree.levelTraverse(root);
// BinTree.levelTraverse(root);
//
// BitNode min = getMinNode(root);
// System.out.println("min = " + min.data);
//
// BitNode max = getMaxNode(root);
// System.out.println("max = " + max.data);
}
// 构造二叉搜索树
public static void insert(BitNode root, int data) {
BitNode node = new BitNode();
node.data = data;
if (root == null) {
root = node;
} else {
if (data < root.data) {
if (root.lchild == null) {
root.lchild = node;
} else {
insert(root.lchild, data);
}
} else {
if (root.rchild == null) {
root.rchild = node;
} else {
insert(root.rchild, data);
}
}
}
}
// 查找最小节点
public static BitNode getMinNode(BitNode root) {
BitNode current, min = null;
current = root;
while (current != null) {
min = current;
current = current.lchild;
}
return min;
}
// 查找最大节点
public static BitNode getMaxNode(BitNode root) {
BitNode current, max = null;
current = root;
while (current != null) {
max = current;
current = current.rchild;
}
return max;
}
// 查找
public static BitNode find(BitNode root, int data) {
BitNode current = root;
while (current.data != data) {
if (data < current.data)
current = current.lchild;
else
current = current.rchild;
if (current == null)
return null;
}
return current;
}
// 得到简要被删除的节点的后继(中序遍历)
public static BitNode getSuccessor(BitNode delNode) {
BitNode successorParent = delNode;
BitNode successor = delNode;
BitNode current = delNode.rchild;
while (current != null) {
successorParent = successor;
successor = current;
current = current.lchild;
}
if (successor != delNode.rchild) {
successorParent.lchild = successor.rchild;
successor.rchild = delNode.rchild;
}
return successor;
}
// 删除一个节点----?删除根节点时会出现错误
public static boolean delete(BitNode root, int data) {
BitNode current = root;
BitNode parent = root;
boolean isLeftChild = true;
while (current.data != data) {// search for node
parent = current;
if (data < current.data) { // go left?
isLeftChild = true;
current = current.lchild;
} else { // go right?
isLeftChild = false;
current = current.rchild;
}
if (current == null) { // end of th
return false; // didn't find it
}
}
// found node to delete
// if no children, simply delete it
if (current.lchild == null && current.rchild == null) {
if (current == root) {// if root
root = null; // tree is empty
} else if (isLeftChild) {
parent.lchild = null;// disconnect
} else { // from parent
parent.rchild = null;
}
} else if (current.rchild == null) {// if no right child replace with
// left subtree
if (current == root) {
root = current.lchild;
} else if (isLeftChild) {
parent.rchild = current.lchild;
} else {
parent.rchild = current.lchild;
}
} else if (current.lchild == null) {// if no left child replace with
// right subtree
if (current == root) {
root = current.rchild;
} else if (isLeftChild) {
parent.lchild = current.rchild;
} else {
parent.rchild = current.rchild;
}
} else {// two chiledren ,so replace with inorde successor
//get successor of node to delete(current)
BitNode successor = getSuccessor(current);
//connect parent of current to successor instead
if(current == root){
root = successor;
} else if(isLeftChild){
parent.lchild = successor;
} else {
parent.rchild = successor;
}
//connect successor to current's left child
successor.lchild = current.lchild;
}
return true;
}
}
Java实现二叉搜索树及相关操作的更多相关文章
- Java实现二叉搜索树
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11406176.html 尝试一下用Java实现二叉搜索树/二叉查找树,记录自己的学习历程. 1 ...
- Java创建二叉搜索树,实现搜索,插入,删除操作
Java实现的二叉搜索树,并实现对该树的搜索,插入,删除操作(合并删除,复制删除) 首先我们要有一个编码的思路,大致如下: 1.查找:根据二叉搜索树的数据特点,我们可以根据节点的值得比较来实现查找,查 ...
- Java实现二叉搜索树的添加,前序、后序、中序及层序遍历,求树的节点数,求树的最大值、最小值,查找等操作
什么也不说了,直接上代码. 首先是节点类,大家都懂得 /** * 二叉树的节点类 * * @author HeYufan * * @param <T> */ class Node<T ...
- Java数据结构——二叉搜索树
定义二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若 ...
- Java实现二叉搜索树的插入、删除
前置知识 二叉树的结构 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() { } TreeNode( ...
- Java对二叉搜索树进行插入、查找、遍历、最大值和最小值的操作
1.首先,须要一个节点对象的类.这些对象包括数据.数据代表存储的内容,并且还有指向节点的两个子节点的引用 class Node { public int iData; public double dD ...
- 6.1 集合和映射--集合Set->底层基于二叉搜索树实现
前言:在第5章的系列学习中,已经实现了关于二叉搜索树的相关操作,详情查看第5章即可.在本节中着重学习使用底层是我们已经封装好的二叉搜索树相关操作来实现一个基本的集合(set)这种数据结构.集合set的 ...
- 二叉搜索树(BST)---python实现
github:代码实现 本文算法均使用python3实现 1. 二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜 ...
- 数据结构-二叉搜索树(BST binary search tree)
本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 二叉搜索树简介 顾名思义,二叉搜索树是以一棵二叉树来组织的,这样的一棵树可以用一个链表数据结构来 ...
随机推荐
- 1433端口无法连接(sql server 数据库无法访问问题)解决思路
登录远程SQL服务器一 看ping 服务器IP能否ping通. 这个实际上是看和远程sql server 2000服务器的物理连接是否存在.如果不行,请检查网络,查看配置,当然得确保远程sql ser ...
- CREATE TABLE - 定义一个新表
SYNOPSIS CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( { column_name data_ty ...
- WPF知识点--自定义Button(ControlTemplate控件模板)
ControlTemplate是一种控件模板,可以通过它自定义一个模板来替换掉控件的默认模板以便打造个性化的控件. ControlTemplate包含两个重要的属性:VisualTree 该模板的视觉 ...
- 时钟周期 VS 机器周期
时钟周期vs机器周期 Clock cycle The speed of a computer processor, or CPU, is determined by the clock cycle, ...
- VC++线程函数内怎么调用外部函数
VC++线程函数内怎么调用外部函数 1.把外部函数做成静态函数,就可以直接调用了.2.把外部函数所在的对象通过线程函数参数传到线程里面来,这样线程里可以使用此对象及其函数了.
- Android获取屏幕的大小与密度的代码
Android项目开发中很多时候需要获取手机屏幕的宽高以及屏幕密度来进行动态布局,这里总结了三种获取屏幕大小和屏幕密度的方法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
- tinyxml
在TinyXML中,根据XML的各种元素来定义了一些类: TiXmlBase:整个TinyXML模型的基类. TiXmlAttribute:对应于XML中的元素的属性. ...
- JS授权
(function(){ var origin_url = location.href; var oauth_url = 'https://vx.mcilife.com/weixin/api/oaut ...
- docker安装配置lnmp
一.安装配置docker 1.下载docker:yum install -y docker 2.设置docker远程镜像地址为国内路径:curl -sSL https://get.daocloud.i ...
- CentOS虚拟机挂载Windows共享目录
Windows文件共享使用了SMB协议(又称CIFS协议),该协议主要提供了文件共享和打印共享功能,分别使用TCP 139和445端口.UNIX.Linux系统提供了该协议的开源实现samba.为了方 ...