一、二叉查找树
1.定义特点维基百科
2.我当时在写实例化的方法的时候很犯愁
=》理解RootNode为整个数中的一个中间节点key
=》Quick Sort的概念
=》实例化的时候不用找到某两个节点的范围
=》按照InOrder Traversal 结构式排序的顺序
二、基本实现
=》节点结构
=》查询
=》添加
=》实例化
=》中序遍历
=》效果图
=》删除节点(实现了在)
//节点的基本结构
class TreeNode {
private int num;
private TreeNode leftChilder;
private TreeNode rightChilder;
//get\set method
}
//查询
//当根为空
//不为空
//找到
//找不到
//search the BST
public static Boolean searchBST(int key) {
// the root is null
TreeNode temp = head;
if (temp == null) return false;
while (temp != null)
{
int num = temp.getNum();
if (key == num) return true;
if (key > num) temp = temp.getRightChilder();
if (key < num) temp = temp.getLeftChilder();
}
return false;
}
//插入数据
//首先查询数据
//存在继续插入
//不存在
//如果Head为空新建
//如果不为空找到位置
//左边、右边知道它左边、右边为空
public static void insertBST(int insertNum) {
//first judege if exist it?
//exist then continue
//not exist then
//judge head
// find it
if (searchBST(insertNum))
{
return;
}
else {
if (head == null)
{
head = new TreeNode();
head.setLeftChilder(null);
head.setRightChilder(null);
head.setNum(insertNum);
Console.WriteLine("===>insert ok...");
return;
}
else {
TreeNode headCopy = head;
TreeNode temp = new TreeNode();
temp.setNum(insertNum);
temp.setLeftChilder(null);
temp.setRightChilder(null);
while (true)
{ //find the left or right position
if (headCopy.getNum() > insertNum)
{
if (headCopy.getLeftChilder() == null)
{
headCopy.setLeftChilder(temp);
break;
}
headCopy = headCopy.getLeftChilder();
}
else
{
if (headCopy.getRightChilder() == null)
{
headCopy.setRightChilder(temp);
break;
}
headCopy = headCopy.getRightChilder();
}
}
Console.WriteLine("===>insert ok...");
return;
}
}
}
//实例化查询树
//实例化很特别,不跟实例化二叉树一一样
// 二叉树可以直接递归插入
//这里多了一个位置的查找过程
//init a binary search tree;
//special positon is the insert is not remove is a not change
public static void initBST() {
try
{
while (true)
{
Console.WriteLine("===>If you input -1 it will be end!");
Console.Write("===>Input you num:");
int data = Int32.Parse(Console.ReadLine());
if (data == -1) {
Console.WriteLine("The BST init successful...");
break; //input the end
}
else
{
insertBST(data);
}
}
}
catch (Exception)
{
Console.WriteLine("\n===>Yon Input Error! So this node is null!!!");
}
}
//外加一个左子树遍历
//刚好一个排序效果
public static void inorderTravers(TreeNode t) {
if (t != null && t.getNum() != -1) {
inorderTravers(t.getLeftChilder());
Console.WriteLine(t.getNum());
inorderTravers(t.getRightChilder());
}
}
//删除效果
//首先判断节点存在不
//不存在继续
//存在
//如果是叶子结点直接父节点指向NULL
//如果只有左子树 左子树替代
//如果只有右子树 右子树替代
//如果左右子树都有
//可以求出左边最大值 删除它然后替换
//也可以求出右边最小值 删除然后替换
========================================
//delete the BST
//exists
// if not exists return;
// if exists
//if is the leaf node delete it
//if the rightChild is not exist just
//if the leftChild is not exist just
//if the all exists then
public static void deleteBST(int deleteNum) {
if (!searchBST(deleteNum))
{
Console.WriteLine("The number is not exist...");
}
else {
//get the node
TreeNode temp = head;
TreeNode parent = null;
while (temp.getNum()!=deleteNum) { //if get the
parent = temp;
if (temp.getNum() > deleteNum) temp = temp.getLeftChilder();
else if (temp.getNum() < deleteNum) temp = temp.getRightChilder();
}
//if the node is the leaf
if (temp.getLeftChilder() == null && temp.getRightChilder() == null) {
if (deleteNum < parent.getNum()) parent.setLeftChilder(null);
else {
parent.setRightChilder(null);
}
}
//if the node's left is null
else if (temp.getLeftChilder() == null)
{
TreeNode right = temp.getRightChilder();
temp.setNum(right.getNum());
temp.setLeftChilder(right.getLeftChilder());
temp.setRightChilder(right.getRightChilder());
}
//if the node's right is null
else if (temp.getRightChilder() == null)
{
TreeNode left = temp.getLeftChilder();
temp.setNum(left.getNum());
temp.setLeftChilder(left.getLeftChilder());
temp.setRightChilder(left.getRightChilder());
}
//if have all the node
//find the left max
//find the right min
else if (temp.getLeftChilder() != null && temp.getRightChilder() != null)
{
//find the left max
TreeNode max = temp.getLeftChilder();
while (max.getRightChilder() != null) {
max = max.getRightChilder();
}
deleteBST(max.getNum());
temp.setNum(max.getNum());
}
}
再来一张图来