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. MAC 添加共享,脚本执行

    Linux需要首先安装 yum install samba-client linxu添加windows 公共盘  mount -t cifs  user=guest,password=guest // ...

  2. day21-4 菱形继承问题(类的查找顺序)

    目录 菱形继承问题 经典类(了解) 新式类 mro方法 菱形继承问题 在Python中子类可以同时继承多个父类,如A(B,C,D) 如果继承关系为非菱形结构,则会按照先找B这一条分支,然后再找C这条分 ...

  3. PyQt5实现第一个桌面应用程序

    import sysfrom PyQt5.QtWidgets import QApplication,QWidget,QDialogfrom PyQt5.QtCore import Qt if __n ...

  4. vs2008如何新建自己工程的环境变量(局部)和 Windows系统(全局). .

    在vs2008的Project->Property设置里经常会看到类似$(IntDir).$(OutDir).$(ProjectName) 的预定义宏.以vc2008为例,有时候我们在引用别的库 ...

  5. Class加载顺序

    原文:https://blog.saymagic.cn/2017/07/01/class-common-question.html 类的初始化顺序是怎样的? 我们尝试从class文件中找到答案.来看这 ...

  6. Linux中find命令用法大全

    Linux 查找命令是Linux系统中最重要和最常用的命令之一.查找用于根据与参数匹配的文件指定的条件来搜索和查找文件和目录列表的命令.查找可以在各种条件下使用,您可以通过权限,用户,组,文件类型,日 ...

  7. python视频 神经网络 Tensorflow

    python视频 神经网络 Tensorflow 模块 视频教程 (带源码) 所属网站分类: 资源下载 > python视频教程 作者:smile 链接:http://www.pythonhei ...

  8. YOLOv3测试命令

    一.老规矩 在darknet\build\darknet\x6下按住shift键,点击鼠标右键选择“在此处打开Powershell 窗口(s)” 二.测试图片命令: .\darknet detect ...

  9. gcc 编译多个源文件

    序 Linux 内核和许多其他自由软件以及开放源码应用程序都是用 C 语言编写并使用 GCC 编译的. 编译C++程序 编译.链接命令 -c 只编译不里链接 -o链接 例: g++ file1 -c ...

  10. 集训第四周(高效算法设计)M题 (扫描法)

    原题:UVA11078 题意:给你一个数组,设a[],求一个m=a[i]-a[j],m越大越好,而且i必须小于j 怎么求?排序?要求i小于j呢.枚举?只能说超时无上限.所以遍历一遍数组,设第一个被减数 ...