Java 空指针错误。二叉搜索树程序
我正试图编写一个二叉树。除了尝试删除根节点外,其他操作都正常 返回以下错误。我不知道如何解决这个问题。请帮忙 所有其他功能,如添加、统计、平衡等都可以正常工作。只有当我尝试在根节点上执行删除时,程序才会返回Java 空指针错误。二叉搜索树程序,java,Java,我正试图编写一个二叉树。除了尝试删除根节点外,其他操作都正常 返回以下错误。我不知道如何解决这个问题。请帮忙 所有其他功能,如添加、统计、平衡等都可以正常工作。只有当我尝试在根节点上执行删除时,程序才会返回 Exception in thread "main" java.lang.NullPointerException at TreeClass$BinarySearchTree.Delete(TreeClass.java:147) at TreeClass$BinarySear
Exception in thread "main" java.lang.NullPointerException
at TreeClass$BinarySearchTree.Delete(TreeClass.java:147)
at TreeClass$BinarySearchTree.fnHandler(TreeClass.java:292)
at TreeClass.main(TreeClass.java:341)
但是,“删除”在树中的其他节点上起作用。仅在根节点上遇到问题。
这是我的密码
import java.util.*;
public class TreeClass
{
//--------------------------------------------------------------
static Scanner scanner = new Scanner(System.in);
static BinarySearchTree BST = new BinarySearchTree();
//--------------------------------------------------------------
public static class TreeNode
{
TreeNode Parent;
TreeNode LChild;
TreeNode RChild;
Integer Data;
public TreeNode(int cbData)
{
this.Data = cbData;
this.LChild = null;
this.RChild = null;
this.Parent = null;
}
public void SetParent(TreeNode parent)
{
this.Parent = parent;
}
}
public static class BinarySearchTree
{
int size;
TreeNode Root;
public BinarySearchTree()
{
this.size = 0;
this.Root = null;
}
public void Allocate(TreeNode node, ArrayList<Integer> DataList)
{
if (node.LChild != null)
Allocate(node.LChild, DataList);
DataList.add(node.Data);
if (node.RChild != null)
Allocate(node.RChild, DataList);
}
public void Add(int cbData)
{
TreeNode temp = null;
TreeNode node = new TreeNode(cbData);
if(this.size == 0)
{
this.Root = node;
}
else
{
temp = this.Root;
while(temp != null)
{
if(cbData > temp.Data)
{
if(temp.RChild == null)
{
temp.RChild = node;
node.Parent = temp;
break;
}
temp = temp.RChild;
}
else if(cbData < temp.Data)
{
if(temp.LChild == null)
{
temp.LChild = node;
node.Parent = temp;
break;
}
temp = temp.LChild;
}
else
{
//System.out.printf("[Error] %d already exists!\n", cbData);
return;
}
}
}
if(size == 0)
System.out.printf("[Success] %d has been added as root\n", node.Data);
else
System.out.printf("[Success] %d has been added - Parent: %d\n", node.Data, node.Parent.Data);
++this.size;
}
public void AddReBalance(int[] List, int min, int max)
{
if(min <= max)
{
int current = (max+min)/2;
Add(List[current]);
AddReBalance(List, min, current-1);
AddReBalance(List, current+1, max);
}
}
public void Delete(int cbData)
{
TreeNode temp = null;
if(this.size > 0)
{
temp = this.Root;
while(temp != null)
{
if(cbData > temp.Data)
temp = temp.RChild;
else if(cbData < temp.Data)
temp = temp.LChild;
else
{
System.out.printf("[Success] %d found and deleted!\n", cbData);
if(temp.LChild != null)
{
temp.LChild.Parent = temp.Parent;
if(temp == temp.Parent.RChild)
temp.Parent.RChild = temp.LChild;
else if(temp == temp.Parent.LChild)
temp.Parent.LChild = temp.LChild;
}
else if(temp.RChild != null)
{
temp.RChild.Parent = temp.Parent;
if(temp == temp.Parent.LChild)
temp.Parent.LChild = temp.RChild;
else if(temp == temp.Parent.RChild)
temp.Parent.RChild = temp.RChild;
}
else
{
if(temp == temp.Parent.LChild)
temp.Parent.LChild = null;
else if(temp == temp.Parent.RChild)
temp.Parent.RChild = null;
temp.Parent = null;
}
--this.size;
return;
}
}
}
System.out.printf("[Error] %d not found!\n", cbData);
}
public int Find(int cbData)
{
int Level = 0;
TreeNode temp = this.Root;
while(temp != null)
{
if(cbData > temp.Data)
{
temp = temp.RChild;
++Level;
}
else if(cbData < temp.Data)
{
temp = temp.LChild;
++Level;
}
else if(cbData == temp.Data)
{
return ++Level;
}
}
return -1;
}
public void Rebalance()
{
int[] cbList = new int[this.size];
ArrayList<Integer> DataList = new ArrayList();
Allocate(this.Root, DataList);
for(int i = 0; i < DataList.size(); ++i)
cbList[i] = DataList.get(i);
this.size = 0;
if(cbList.length > 0)
AddReBalance(cbList, 0, cbList.length-1);
else
System.out.print("[Error] You do not have any nodes to balance!\n");
}
public void DisplayContent(TreeNode node)
{
ArrayList<Integer> DataList = new ArrayList();
Allocate(this.Root, DataList);
System.out.printf("Tree Content: ");
for(int i = 0; i < DataList.size(); ++i)
System.out.printf("%d ", DataList.get(i));
System.out.printf("\n");
}
public void GetPathData(TreeNode node, ArrayList<Integer> DepthList, int Level)
{
++Level;
if(node.RChild != null | node.LChild != null)
{
if (node.LChild != null)
GetPathData(node.LChild, DepthList, Level);
if (node.RChild != null)
GetPathData(node.RChild, DepthList, Level);
}
else
{
DepthList.add(Level);
Level = 0;
}
}
public void DisplayStats()
{
int Level = 0, Max = 0, Min = 0;
ArrayList<Integer> DList = new ArrayList();
GetPathData(this.Root, DList, Level);
for(int i = 0; i < DList.size(); ++i)
{
int TempPath = DList.get(i);
if(i == 0)
{
Min = TempPath;
Max = TempPath;
}
else
{
if(Min > TempPath)
Min = TempPath;
if(Max < TempPath)
Max = TempPath;
}
}
System.out.printf("Root Data: %d\nItem Count: %d\nShortest Path: %d" +
"\nLongest Path: %d\n\n", this.Root.Data, this.size, Min, Max);
}
public boolean fnHandler(int cbIn)
{
int cbInItem = 0;
int cbTempRetn = 0;
boolean retn = false;
switch(cbIn)
{
case 1:
System.out.printf("Input an integer to add: ");
cbInItem = scanner.nextInt();
Add(cbInItem);
break;
case 2:
System.out.printf("Input an integer to delete: ");
cbInItem = scanner.nextInt();
Delete(cbInItem);
break;
case 3:
System.out.printf("Input an integer to find:");
cbInItem = scanner.nextInt();
cbTempRetn = BST.Find(cbInItem);
if(cbTempRetn == -1)
System.out.printf("[Error] This item was not found!\n");
else
System.out.printf("[Success] Item was found on level: %d\n", cbTempRetn);
break;
case 4:
BST.Rebalance();
System.out.printf("[Success] Tree has been balanced!\n");
break;
case 5:
BST.DisplayContent(BST.Root);
break;
case 6:
BST.DisplayStats();
break;
case 7:
retn = true;
System.out.printf("[Exitting...]\n");
break;
}
return retn;
}
}
public static void main(String[] args)
{
int cbInput = 0;
boolean exit = false;
while(exit == false)
{
System.out.printf("\n1. Add Entry - 2. Delete Item - 3. Find Item - 4. Balance Tree"
+ "\n5. List Data - 6. Statistics - 7. Exit\n\nInput: ");
cbInput = scanner.nextInt();
exit = BST.fnHandler(cbInput);
}
}
}
import java.util.*;
公共类树类
{
//--------------------------------------------------------------
静态扫描仪=新扫描仪(System.in);
静态BinarySearchTree BST=新的BinarySearchTree();
//--------------------------------------------------------------
公共静态类树节点
{
树状体亲本;
特雷诺德·勒奇尔德;
三叶草;
整数数据;
公共树节点(int cbData)
{
this.Data=cbData;
this.LChild=null;
this.RChild=null;
this.Parent=null;
}
public void SetParent(TreeNode parent)
{
这个。父=父;
}
}
公共静态类二进制搜索树
{
整数大小;
树根;
公共二进制搜索树()
{
此值为0.size=0;
this.Root=null;
}
公共无效分配(TreeNode节点,ArrayList数据列表)
{
if(node.LChild!=null)
分配(node.LChild、DataList);
DataList.add(node.Data);
如果(node.RChild!=null)
分配(node.RChild,DataList);
}
公共无效添加(int cbData)
{
树节点温度=零;
树节点=新树节点(cbData);
如果(this.size==0)
{
this.Root=节点;
}
其他的
{
temp=这个.Root;
while(temp!=null)
{
如果(cbData>温度数据)
{
如果(temp.RChild==null)
{
temp.RChild=节点;
node.Parent=temp;
打破
}
temp=temp.RChild;
}
否则如果(cbData<温度数据)
{
如果(temp.LChild==null)
{
temp.LChild=节点;
node.Parent=temp;
打破
}
temp=temp.LChild;
}
其他的
{
//System.out.printf(“[错误]%d已存在!\n”,cbData);
返回;
}
}
}
如果(大小==0)
System.out.printf(“[Success]%d已添加为root\n”,node.Data);
其他的
System.out.printf(“[Success]%d已添加-父项:%d\n”,node.Data,node.Parent.Data);
++这个尺寸;
}
公共void AddReBalance(int[]列表,int最小值,int最大值)
{
如果(最小0)
{
temp=这个.Root;
while(temp!=null)
{
如果(cbData>温度数据)
temp=temp.RChild;
否则如果(cbData<温度数据)
temp=temp.LChild;
其他的
{
System.out.printf(“[Success]%d找到并删除!\n”,cbData);
if(temp.LChild!=null)
{
temp.LChild.Parent=临时家长;
if(temp==temp.Parent.RChild)
temp.Parent.RChild=temp.LChild;
else if(temp==temp.Parent.LChild)
temp.Parent.LChild=temp.LChild;
}
else if(temp.RChild!=null)
{
temp.RChild.Parent=临时父对象;
if(temp==temp.Parent.LChild)
temp.Parent.LChild=temp.RChild;
else if(temp==temp.Parent.RChild)
temp.Parent.RChild=temp.RChild;
}
其他的
{
if(temp==temp.Parent.LChild)
temp.Parent.LChild=null;
else if(temp==temp.Parent.RChild)
temp.Parent.RChild=null;
temp.Parent=null;
}
--这个尺寸;
返回;
}
}
}
System.out.printf(“[错误]%d未找到!\n”,cbData);
}
公共int查找(int cbData)
{
智力水平=0;
TreeNode temp=此.Root;
while(temp!=null)
{
如果(cbData>温度数据)
{
temp=temp.RChild;
++水平;
}
否则如果(cbData<温度数据)
{
temp=temp.LChild;
++水平;
}
else if(cbData==临时数据)
{
返回++级;
}
}
返回-1;
}
公共空间再平衡()
{
int[]cbList=新int[
if(temp.LChild != null)
{
temp.LChild.Parent = temp.Parent;
if(temp == temp.Parent.RChild)
temp.Parent.RChild = temp.LChild;
else if(temp == temp.Parent.LChild)
temp.Parent.LChild = temp.LChild;
}
temp == temp.Parent.RChild