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实现二叉搜索树及相关操作的更多相关文章

  1. Java实现二叉搜索树

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11406176.html 尝试一下用Java实现二叉搜索树/二叉查找树,记录自己的学习历程. 1 ...

  2. Java创建二叉搜索树,实现搜索,插入,删除操作

    Java实现的二叉搜索树,并实现对该树的搜索,插入,删除操作(合并删除,复制删除) 首先我们要有一个编码的思路,大致如下: 1.查找:根据二叉搜索树的数据特点,我们可以根据节点的值得比较来实现查找,查 ...

  3. Java实现二叉搜索树的添加,前序、后序、中序及层序遍历,求树的节点数,求树的最大值、最小值,查找等操作

    什么也不说了,直接上代码. 首先是节点类,大家都懂得 /** * 二叉树的节点类 * * @author HeYufan * * @param <T> */ class Node<T ...

  4. Java数据结构——二叉搜索树

    定义二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若 ...

  5. Java实现二叉搜索树的插入、删除

    前置知识 二叉树的结构 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() { } TreeNode( ...

  6. Java对二叉搜索树进行插入、查找、遍历、最大值和最小值的操作

    1.首先,须要一个节点对象的类.这些对象包括数据.数据代表存储的内容,并且还有指向节点的两个子节点的引用 class Node { public int iData; public double dD ...

  7. 6.1 集合和映射--集合Set->底层基于二叉搜索树实现

    前言:在第5章的系列学习中,已经实现了关于二叉搜索树的相关操作,详情查看第5章即可.在本节中着重学习使用底层是我们已经封装好的二叉搜索树相关操作来实现一个基本的集合(set)这种数据结构.集合set的 ...

  8. 二叉搜索树(BST)---python实现

    github:代码实现 本文算法均使用python3实现 1. 二叉搜索树定义   二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree).   二叉搜 ...

  9. 数据结构-二叉搜索树(BST binary search tree)

    本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 二叉搜索树简介 顾名思义,二叉搜索树是以一棵二叉树来组织的,这样的一棵树可以用一个链表数据结构来 ...

随机推荐

  1. 理解 call, apply 的用法

    callcall() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数. function list() { return Array.prototype.slice.call ...

  2. hibernate 批量抓取

    使用场景: 是查询出来一个集合,然后又查询每个集合对象中的集合.使用set标签中的batch-size属性实现. 数据库中只有5个区道信息: 设置batch-size=”5”,执行的查询语句如下: 而 ...

  3. clusterdb - 对一个PostgreSQL数据库进行建簇

    SYNOPSIS clusterdb [ connection-option...] [ --table | -t table] [ dbname] clusterdb [ connection-op ...

  4. ARP是如何工作的?

    我们知道,当我们在浏览器里面输入网址时,DNS服务器会自动把它解析为IP地址,浏览器实际上查找的是IP地址而不是网址.那么IP地址是如何转换为第二层物理地址(即MAC地址)的呢? 在局域网中,这是通过 ...

  5. JavaSE-17 泛型

    学习要点 泛型接口 泛型类 泛型方法 多参数泛型类 泛型类的继承 泛型的定义 允许在定义类.接口.方法时使用类型形参,类型形参将会在声明变量.创建对象或者调用方法时候动态指定. 泛型接口 1  定义 ...

  6. BZOJ4832: [Lydsy1704月赛]抵制克苏恩 (记忆化搜索 + 概率DP)

    题意:模拟克苏恩打奴隶战对对方英雄所造成的伤害 题解:因为昨(今)天才写过记忆化搜索 所以这个就是送经验了 1A还冲了个榜 但是我惊奇的发现我数组明明就比数据范围开小了啊??? #include &l ...

  7. ajax请求回数组数据,Vue页面数组没同步问题

    记录bug 为什么 ajax 获取到了 vm.$data.list 页面上却没有显示出来的? 代码 //页面 <tr v-for="item in list">{{ * ...

  8. 读书笔记:《人有人的用处》------N.维纳. (2016.12.28)

    读书笔记:<人有人的用处>------N.维纳 ·某些系统可以依其总能量而和其他系统区别开来. ·在某些情况下,一个系统如果保持足够长时间的运转,那它就会遍历一切与其能量相容的位置和动量的 ...

  9. UVa 548 树(已知其中两种遍历, 还原树)

    题意: 给出后序遍历和先序遍历, 还原一棵树, 然后求出从根节点到叶子的最小路劲和. 分析: 已知后序遍历, 那么后序的最后一个节点就是根节点, 然后在中序中找到这个节点, 它的左边就是左子树, 它的 ...

  10. 09-看图理解数据结构与算法系列(B树)

    B树 B树即平衡查找树,一般理解为平衡多路查找树,也称为B-树.B_树.是一种自平衡树状数据结构,能对存储的数据进行O(log n)的时间复杂度进行查找.插入和删除.B树一般较多用在存储系统上,比如数 ...