Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 空指针错误。二叉搜索树程序_Java - Fatal编程技术网

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