用Java将链表转换为树



我必须将单链表、双链表和循环链表转换为二叉树。

我已经制作了一个单独链接的列表,我很难理解如何将其转换为树。

我的单链表节点如下:

public class Node {
    Node next;
    Object data;
    public Node(Object _data)
    {
        next = null;
        data = _data;
    }
    public Node(Object _data, Node _next)
    {
        next = _next;
        data = _data;
    }
    public Object getData()
    {
        return data;
    }
    public void setData(Object _data)
    {
        data = _data;
    }
    public Node getNext()
    {
        return next;
    }
    public void setNext(Node _next)
    {
        next = _next;
    }
}

这是我的单链表类:

import java.util.Collection;
import java.util.Collections;

public class LinkedList {
    private Node head;
    private int listCount;
    public LinkedList()
    {
        head = new Node(null);
        listCount = 0;
    }
    public void add(Object data)
    {
        Node temp = new Node(data);
        Node current = head;
        head.setData(temp.getData());
        while(current.getNext() != null)
        {
            current = current.getNext();
        }
        current.setNext(temp);
        listCount++;
    }
    public void add(Object data, int index)
    {
        Node temp = new Node(data);
        Node current = head;
        head.setData(temp.getData());
        for (int i = 1; i < index && current.getNext() != null; i++)
        {
            current = current.getNext();
        }
        temp.setNext(current.getNext());
        current.setNext(temp);
        listCount++;
    }
    public Object get(int index)
    {
        if(index <= 0)
        {
            return null;
        }
        Node current = head.getNext();
        for(int i = 1; i < index; i++)
        {
            if(current.getNext() == null)
            {
                return null;
            }
            current = current.getNext();
        }
        return current.getData();
    }
    public int size()
    {
        return listCount;
    }
    public boolean remove(int index)
    {
        if(index < 1 || index > size())
        {
            return false;
        }
        Node current = head;
        for(int i = 1; i < index; i++)
        {
            if(current.getNext() == null)
            {
                return false;
            }
            current = current.getNext();
        }
        current.setNext(current.getNext().getNext());
        listCount--;
        return true;
    }
    public boolean contains(Object data)
    {
        Node temp = new Node(data);
        Node current = head;
        for(int i = 0; i < size(); i++)
        {
            if(temp.getData().equals(current.getData()))
            {
                return true;
            }
            else
            {
                current = current.getNext();
            }
        }
        return false;
    }
    public Node inserAfter(Object data, Node n)
    {
        Node temp = new Node(data);
        Node current = n.getNext();
        temp.setNext(current);
        n.setNext(temp);
        return temp;
    }
    public void rotateLeft()
    {
        Node temp = head;
        if (head != null) {                       //otherwise it is empty list
            if (head.getNext() != null) {           //otherwise it is single item list
                head = head.getNext();
            }
        }
        Node tail;
        if (head.getNext() != null) {
            tail = head.getNext();
        } else {
            tail = head;
        }
        while(tail.getNext() != null)
        {
            if (tail.getNext() != null) {
                tail = tail.getNext();
            }
        }
        tail.setNext(temp);
        temp.setNext(null);
    }
    public void rotateRight()
    {
        Node temp = null;
        Node current = head;
        while(current.getNext() != null)
        {
            temp = current;
            current = current.getNext();
        }
        current.setNext(head);
        head = current;
        temp.setNext(null);
    }
    public void reverse()
    {
        Node reversedPart = null;
        Node current = head;
        while(current != null)
        {
            Node next = current.next;
            current.next = reversedPart;
            reversedPart = current;
            current = next;
        }
        head = reversedPart;
    }
    public Node copyList(Node source)
    {
        Node copyHead = null;
        Node copyTail = null;
        Node temp = new Node(source);
        Node current = head.getNext();
        for(int i = 0; i < size(); i++)
        {
            Node newNode = new Node(temp.getData());
            if(copyHead == null)
            {
                copyHead = newNode;
                copyTail = copyHead;
            }
            else
            {
                copyTail.setNext(newNode);
                copyTail = copyTail.getNext();
            }
        }
        return copyHead;
    }
    public Object setDataIndexOf(Object data, int index)
    {
        Node node = nodeAt(index);
        if(node == null)
        {
            return null;
        }
        else
        {
            Object old = node.getData();
            node.setData(data);
            return old;
        }
    }
    public Object dataAt(int index)
    {
        Node current = head.getNext();
        if(index < 1 || index > size())
        {
            return null;
        }
        for(int i = 0; i < index; i ++)
        {
            if(i != index - 1)
            {
                current = current.getNext();
            }
        }
        return current.getData();
    }
    public Node nodeAt(int index)
    {
        Node current = head.getNext();
        if(index < 1 || index > size())
        {
            return null;
        }
        for(int i = 0; i < index; i++)
        {
            if(i != index - 1)
            {
                current = current.getNext();
            }
        }
        return current;
    }
    public int indexOf(Object data)
    {
        Node temp = new Node(data);
        Node current = head.getNext();
        for(int i = 0; i < size(); i++)
        {
            if(current.getData().equals(temp.getData()))
            {
                return i;
            }
            current = current.getNext();
        }
        return -1;
    }
    public Object min()
    {
        Integer min = (Integer)head.getData();
        Node current = head;
        while(current.getNext() != null)
        {
            if((Integer)current.getData() < min)
            {
                min = (Integer)current.getData();
            }
            current = current.getNext();
        }
        return min;
    }
    public Object max()
    {
        Integer max = (Integer)head.getData();
        Node current = head;
        while(current.getNext() != null)
        {
            if((Integer)current.getData() > max)
            {
                max = (Integer)current.getData();
            }
            current = current.getNext();
        }
        return max;
    }
    public void removeSecondAppear(Object data)
    {
        Node temp = new Node(data);
        Node current = head;
        Node previous = null;
        boolean found = false;
        while(current != null)
        {                       
            if(current.getData().equals(temp.getData()) && current.getData() != null)
            {
                if(found == true)
                {
                    previous.setNext(current.getNext());
                    break;
                }
                else if(found == false)
                {
                    found = true;
                }
            }
            else{
                found = false;
            }
            previous = current;
            current = current.getNext();
        }
    }
    public String toString()
    {
        Node current = head.getNext();
        String output = "";
        while(current != null)
        {
            output += "[" + current.getData().toString() + "]";
            current = current.getNext();
        }
        return output;
    }
}

创建了单独链接的列表后,我必须基于该列表创建一个新的树。我完全迷路了,不知道该怎么开始。以前从未做过类似的事情。任何帮助都将不胜感激。

首先需要实现一个二进制搜索树。我刚用了一个谷歌,有很多Java实现的例子可以学习。您的二进制搜索树应该有一个接受一个参数的insert方法,理想情况下是一个无界类型,但考虑到您的列表实现,现在只使用Object:

public void insert(Object element);

一旦构建了BST,就遍历列表并将元素添加到树中,如下所示:

LinkedList list = new LinkedList();
list.add("foo");
list.add("bar");
list.add("baz");
list.add("etc");
BinarySearchTree bst = new BinarySearchTree(); 
for(Object o:list) {
    bst.add(o);
}

相关内容

  • 没有找到相关文章

最新更新