我正在尝试创建包含两个 int 值和一个按字典顺序排序的字符串值的二叉树,但我不知道该怎么做。我创建了一个已经排序的数组列表,但是二叉树必须是基于引用的,未排序,我正在考虑在创建列表时对其进行排序。有人能帮忙吗?任何简短的想法将不胜感激。
3 回答
二叉树是递归的东西。创建一个名为 BinaryTree 的类(我希望您使用 C++、.NET 或 JAVA),它有两个对其他两个 BinaryTrees 的引用(默认情况下为 null)。然后创建一个递归的插入函数。
我不知道您要完成什么,但是在构建二叉树时,通常找不到数组。
听起来您已经有一个数据结构来存储两个 int 值和一个字符串(因为您已将它们排序在数组列表中)。您可以将此数据结构包含在“树节点”中。一个节点通常有一个指向父节点(除非它是根节点)和 2 个子节点的引用指针。
由于您希望对树进行排序,因此您真正想要的是一种称为堆的特殊形式的二叉树。下面的 Binary Heap 维基百科页面的链接有一个算法来展示如何对二进制堆进行排序。
http://en.wikipedia.org/wiki/Binary_heap
这里有一些关于堆和树的更一般的信息。
http://en.wikipedia.org/wiki/Binary_tree
http://en.wikipedia.org/wiki/Heap_(data_structure)
编辑:您不必使用文字树结构以树形式存储数据。使用数组构建树是完全可以接受的。您可以计算数组的索引,而不是使用引用指针(父节点和 1 或 2 个子节点)。每组孩子都被认为是树中的一个“行”。根元素在零行上。第一排是两个孩子。根的孩子的孩子在第二行,依此类推。
使用这种模式,可以使用 array[2*n+1] 和 array[2*n+2] 找到任何节点的子节点,其中 n 是父节点的行。任何节点的父节点都可以使用 array[floor( (n-1)/2)] 找到。
您首先应该创建一个类来存储您的数据并实现Comparable
或使用Comparator
.
public class Data { // Implement Comparable...
private String s;
private int n1;
private int n2;
// Implement constructors, getters, setters based on what you need...
// Implement compareTo (+ equals + hashCode) unless your going with Comparator
}
然后使用一个Collection
实现SortedSet
来存储你的数据,TreeSet 是一个不错的选择。中的对象SortedSet
是通过引用存储的,因此如果您修改在局部变量中设置的值,它也会在集合中被修改。
编辑:如果我正确理解了您关于基于引用的列表的问题,那么在 Java 中可能会出现以下问题。
List<Data> dataList = // Create list and add data into it.
Data data = dataList.get(4);
data.setS(103); // Modifies S in the local data-object and in dataList because they are reference based.