// =============== Program Description ===============
// 程序名称: tree07.java
// 程序目的:输入一节点,并从二叉树中删除该节点。
// Written By Kuo-Yu Huang. (WANT Studio.)
// ===================================================
import ConsoleReader.*; // 导入已定义的数据输入类
public class tree07
{
public static void main (String args[])
{
int i; // 循环计数变量
int Data[] = // 读入输入值所使用的暂存变量
{ 5, 2, 9, 4, 7, 3, 6, 8, 1,12};
BNTreeArray BNTree = new BNTreeArray(); // 声明二叉树数组
int KeyValue; // 欲查找值
int Pointer;
BNTree.TreeData[0] = Data[0];
for ( i=1 ; i<10 ; i++) // 读取输入值
BNTree.Create(Data[i]); // 建立二叉树
BNTree.PrintAll();
System.out.print("Please input the KeyValue for Delete Node : ");
ConsoleReader console = new ConsoleReader(System.in);
KeyValue = console.readInt();
BNTree.Delete(0,KeyValue);
BNTree.PrintAll();
}
}
class BNTreeArray
{
public static int MaxSize = 16;
public static int[] TreeData = new int[MaxSize];
public static int[] RightNode = new int[MaxSize];
public static int[] LeftNode = new int[MaxSize];
public static int Position = 0; // 节点的位置(是左子树1或右子树-1)
public BNTreeArray()
{
int i; // 循环计数变量
for ( i=0 ; i<MaxSize ; i++ )
{
TreeData[i] = 0;
RightNode[i] = -1;
LeftNode[i] = -1;
}
}
//----------------------------------------------------
// 建立二叉树
//----------------------------------------------------
public void Create(int Data)
{
int i; // 循环计数变量
int Level = 0; // 树的阶层数
Position = 0;
for ( i=0 ; TreeData[i] != 0 ; i++);
TreeData[i] = Data;
while ( true ) // 寻找节点位置
{
// 判断是左子树或是右子树
if ( Data > TreeData[Level] )
{
// 右树是否有下一阶层
if ( RightNode[Level] != -1 )
Level = RightNode[Level];
else
{
Position = -1; // 设定为右树
break;
}
}
else
{
// 左树是否有下一阶层
if ( LeftNode[Level] != -1 )
Level = LeftNode[Level];
else
{
Position = 1; // 设定为左树
break;
}
}
}
if ( Position == 1) // 建立节点的左右连接
LeftNode[Level] = i; // 连接左子树
else
RightNode[Level] = i; // 连接右子树
}
//----------------------------------------------------
// 打印所有二叉树节点数据
//----------------------------------------------------
public void PrintAll()
{
int i; // 循环计数变量
System.out.println("The Binary Tree Node Data : ");
System.out.println(" [Left] [Data] [Right]");
for ( i=0 ; i<MaxSize ; i++ )
{
if ( TreeData[i] != 0 )
{
System.out.print("Node"+i);
System.out.print(" ["+LeftNode[i]+"]");
System.out.print(" ["+TreeData[i]+"]");
System.out.println(" ["+RightNode[i]+"]");
}
}
}
//---------------------------------------------------------
// 二叉树查找
//---------------------------------------------------------
public static int SearchParent(int Pointer,int Node)
{
int Parent; // 声明父节点的指针
Parent = Pointer; // 设定指针初始值
Position = 0; // 设定位置的初始值
while ( Pointer != -1 )
{
if ( TreeData[Pointer] == Node )// 找到该节点
{
System.out.println("Parent"+Parent);
System.out.println("Position"+Position);
return Parent;
}
else
{
Parent = Pointer; // 保留父节点指针
// 比较数据
if ( TreeData[Pointer] > Node)
{
// 指向左子树
Pointer = LeftNode[Pointer];
Position = 1; // 设定其为左子树
}
else
{
// 指向右子树
Pointer = RightNode[Pointer];
Position = -1; // 设定其为右子树
}
}
}
return -1;
}
//---------------------------------------------------------
// 进行节点的删除
//---------------------------------------------------------
public static void Delete(int Root,int Node)
{
int Parent; // 父节点指针
int Pointer = 0; // 欲删除节点的指针
int Child; // 子节点指针
// 寻找欲删除的节点的父节点指针
Parent = SearchParent(Root,Node);
if ( Parent != -1 ) // 该节点在二叉树中
{
switch ( Position ) // 判断删除的位置
{
case 1: // 左子节点
Pointer = LeftNode[Parent];
break;
case -1: // 右子节点
Pointer = RightNode[Parent];
break;
case 0: // 根节点
Pointer = Parent;
break;
}
// 没有左子树也没有右子树
if ( LeftNode[Pointer] == -1 && RightNode[Pointer] == -1 )
{
switch ( Position ) // 判断删除的位置
{
case 1: // 将父节点的左指针指向NULL
LeftNode[Parent] = -1;
break;
case -1: //将父节点的右指针指向NULL*/
RightNode[Parent] = -1;
break;
case 0: // 根节点指向NULL
Parent = -1;
break;
}
}
// 没有左子树
if ( LeftNode[Pointer] == -1 && RightNode[Pointer] != -1 )
{
// 将父节点的右指针指向节点的右子节点
if ( Parent != Pointer )
RightNode[Parent] = RightNode[Pointer];
else // 将根节点指向右子节点
Root = RightNode[Root];
Free(Pointer); // 释放节点存储空间
}
// 没有右子树
else if ( RightNode[Pointer] == -1 && LeftNode[Pointer] != -1 )
{
// 将父节点的左指针指向节点的左子节点
if ( Parent != Pointer )
LeftNode[Parent] = LeftNode[Pointer];
else // 将根节点指向左子节点
Root = LeftNode[Root];
Free(Pointer); // 释放节点存储空间
}
// 有左子树也有右子树
else if ( RightNode[Pointer] != -1 && LeftNode[Pointer] != -1)
{
Parent = Pointer; // 将父节点指向目前的节点
Child = LeftNode[Pointer];// 设定子节点
// 找到左子树中的最右边的叶子点
while ( RightNode[Child] != -1 )
{
Parent = Child; // 保留父节点的指针
// 往右子树前进
Child = RightNode[Child];
} // 将原节点设定成叶节点的数据值
TreeData[Pointer] = TreeData[Child];
if ( LeftNode[Parent] == Child )
LeftNode[Parent] = LeftNode[Child];
else
RightNode[Parent] = RightNode[Child];
Free(Child); // 释放节点存储空间
}
}
}
//---------------------------------------------------------
// 节点的释放
//---------------------------------------------------------
public static void Free(
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
(java语言版)源代码.rar (99个子文件)
CH08
SORT_05.java 2KB
SORT_02.java 2KB
Sort_04.java 3KB
SORT_01.java 1KB
Sort_08.java 4KB
ConsoleReader.java 1KB
Sort_06.java 3KB
SORT_03.java 2KB
Sort_07.java 3KB
CH05
Queue02.java 3KB
ConsoleReader.java 1KB
Queue01.java 3KB
Queue03.java 4KB
Queue04.java 4KB
CH10
d_create.java 3KB
d_delete.java 4KB
c_create.java 3KB
ConsoleReader.java 1KB
d_insert.java 4KB
c_delete.java 4KB
c_insert.java 4KB
CH09
k_search.java 3KB
t_search.java 3KB
F_SEARCH.java 2KB
ConsoleReader.java 1KB
h_search.java 3KB
i_search.java 2KB
s_search.java 1KB
O_SEARCH.java 3KB
L_SEARCH.java 1KB
r_search.java 2KB
b_search.java 2KB
CH04
Stack01.java 3KB
Stack06.java 4KB
Stack03.java 5KB
ConsoleReader.java 1KB
Stack02.java 962B
Stack04.java 4KB
Stack05.java 4KB
CH01
ConsoleReader.java 1KB
SSearch.java 2KB
Fibn.java 1KB
CH02
array09.java 1KB
array06.java 1KB
array10.java 1KB
array08.java 1KB
array11.java 1KB
ConsoleReader.java 1KB
array04.java 1KB
array05.java 2KB
array02.java 2KB
array03.java 1KB
array01.java 1KB
array07.java 2KB
CH06
comb.java 1KB
gcd.java 1KB
maze.java 2KB
hanoi.java 2KB
ConsoleReader.java 1KB
multiply.java 1KB
factor.java 1KB
reverse.java 1KB
fib.java 1KB
queen.java 3KB
CH03
insert.java 4KB
create.java 3KB
search.java 3KB
ConsoleReader.java 1KB
AList.java 1KB
delete.java 4KB
invert.java 4KB
concate.java 3KB
CH07
tree12.java 6KB
tree08.java 7KB
tree06.java 4KB
tree11.java 4KB
tree03.java 3KB
BNTreeArray.class 2KB
ConsoleReader.class 1023B
tree02.java 3KB
tree10.java 5KB
ConsoleReader.java 1KB
tree04.java 3KB
tree13.java 4KB
tree07.java 8KB
tree07.class 859B
tree09.java 3KB
tree05.java 3KB
tree07.java.bak 8KB
tree01.java 2KB
CH11
bfs.java 4KB
ml_graph.java 4KB
ConsoleReader.java 1KB
m_graph.java 2KB
kruskal.java 5KB
l_graph.java 3KB
dijkstra.java 4KB
dfs.java 3KB
prims.java 5KB
共 99 条
- 1
资源评论
feifei0101
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功