class Node
{
public int iData ;
public float fData ;
public Node left ;
public Node right ;
//方法
public Node(int iData,float fData){}
public void displayNode(){}
}
class Tree
{
Node root ;//树根
//方法
public void insert(){}
public void displayTree(){}
public void find(){}
public void delete(){}
}
//插入子节点
public void insert(int iData ,float fData)
{
Node newNode = new Node(iData,fData) ;
if(root == null)
root = newNode ;
else
{
Node current = root ;
Node parent ;
while(true)//寻找插入的位置
{
parent = current ;
if(iData<current.iData)
{
current = current.left ;
if(current == null)
{
parent.left = newNode ;
return ;
}
}
else
{
current =current.right ;
if(current == null)
{
parent.right = newNode ;
return ;
}
}
}
}
}
//中序遍历方法
public void inOrder(Node localRoot)
{
if(localRoot != null)
{
inOrder(localRoot.left) ;//调用自身来遍历左子树
localRoot.displayNode() ;//访问这个节点
inOrder(localRoot.right) ;//调用自身来遍历右子树
}
}
//查找某个节点
public Node find(int iData)
{
Node current = root ;
while(current.iData != iData)
{
if(current.iData<iData)
current = current.right ;
else
current = current.left ;
if(current == null)
return null ;
}
return current ;
}
//查找关键字最小的节点
public Node findMinNode()
{
Node current , last ;
last = null ;
current = root ;
if(current.left == null)
return current ;
else
{
while(current != null)
{
last = current ;
current = current.left ;
}
return last ;
}
}
public boolean delete(int key)
{
//先找到需要删除的节点
Node current = root ;
Node parent = root ;
boolean isLeftChild = false ;
while(current.iData != key)//显然,当current.iData == key 时,current 就是要找的节点
{
parent = current ;
if(key < current.iData)
{
isLeftChild = true ;
current = current.left ;
}
else
{
isLeftChild = false ;
current = current.right ;
}
if(current == null)//找不到key时返回false
return false ;
}
//continue ........
}
//接上................
//分情况考虑删除的节点
//删除的节点为叶节点时
if(current.left == null && current.right == null)
{
if(current == root)
root = null ;
else
if(isLeftChild)
parent.left = null ;
else
parent.right = null ;
}
//continue...........
//接上.......
//删除的节点有一个子节点
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 ;//要删除的节点是一个右子节点
}
//continue.......
//返回后继节点
private Node getSuccessor(Node delNode)
{
Node successorParent = delNode ;//后继节点的父节点
Node successor = delNode ;//后继节点
Node current = delNode.right ;//移动到位置节点位置
while(current != null)
{
successorParent = successor ;
successor = current ;
current = current.left ;
}
if(successor != delNode.right)
{
successorParent.left = successor.right ;
successor.right = delNode.right ;
}
return successor ;
}
//要删除的节点为左子节点时 parent.left = successor ; successor.left = current.left ; //要删除的节点是右子节点时 parent.right = successor ; successor.left = current.left ;
//假如要删除的节点为右子节点 successorParent.left = successor.right ;//第一步 successor.right = current.right ;//第二步 parent.right = successor ; successor.left = current.left ; //假设要删除的节点为左子节点 successorParent.left = successor.right ; successor.right = current.right ; parent.left = successor ; successor.left = current.left ;
//接上
//删除的节点有两个子节点
else
{
Node successor = getSuccessor(current) ;//找到后继节点
if(current == root)
root = successor ;
else
if(isLeftChild)
parent.left = successor ;
else
parent.right = successor ;
successor.left = current.left ;
}
//continue....
//删除某个节点
public boolean delete(int key)
{
//先找到需要删除的节点
Node current = root ;
Node parent = root ;
boolean isLeftChild = false ;
while(current.iData != key)//显然,当current.iData == key 时,current 就是要找的节点
{
parent = current ;
if(key < current.iData)
{
isLeftChild = true ;
current = current.left ;
}
else
{
isLeftChild = false ;
current = current.right ;
}
if(current == null)//找不到key时返回false
return false ;
}
//分情况考虑删除的节点
//删除的节点为叶节点时
if(current.left == null && current.right == null)
{
if(current == root)
root = null ;
else
if(isLeftChild)
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
{
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 ;
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有