我必须编写几种不同类型的二叉树。但是,我不允许使用诸如数组或集合之类的util。如果需要,建议构建我自己的数组。问题是,我甚至不知道从哪里开始。我怎么能建立一个2D阵列?
答案 0 :(得分:4)
您必须通过创建对象手动创建链接列表或树,每个对象都包含指向列表或树中下一个对象的指针。这是我在学校时在数据结构课上多次进行的练习。了解如何通过插入和删除保持列表或树的完整性是一个有用的练习。
public class ListNode<T> { private T payload; private ListNode<T> nextNode; } public class TreeNode<T> { private T payload; private TreeNode<T> leftChild, rightChild; }
答案 1 :(得分:3)
您不需要用于构建树的数组。有几本关于算法和数据结构的书籍,如果你在维基百科上找不到你需要的东西:
http://en.wikipedia.org/wiki/Binary_tree
或http://en.wikipedia.org/wiki/List_of_data_structures
(回答问题:对于2d数组,创建1d数组,并在1d数组中存储1d数组。可以通过创建自己的链表实现来模拟内置数组。但它既不高效也不是你的老师正在考虑。)
(实际问题的灵感,你不知道你是谁 问:
这样的东西是二进制搜索的核心数据结构 树...
class Node { Object value; Node left; Node right; } )
答案 2 :(得分:1)
答案 3 :(得分:1)
编辑:好的,每个人都提到了列表,但是我们不要忘记你也可以在数组上实现二叉树,就像实现堆一样。所以我们有类似的东西:
public class BinaryTree {
private int[] tree; // assuming each node holds an integer.
private int nodeCount;
public BinaryTree (int nodes) {
tree = new int[nodes * 2];
nodeCount = nodes;
}
public int getRoot() {
return tree[0];
}
private int getPositionOfNode(int value) {
for(int i = 0; i < nodeCount; i++) {
if(tree[i] == value) {
return i;
}
}
return -1;
}
public int getLeftChildOfNode(int node) {
int pos = getPositionOfNode(node);
if(pos != -1) {
return tree[pos * 2];
}
return pos;
}
public int getRightChildOfNode(int node) {
int pos = getPositionOfNode(node);
if(pos != -1) {
return tree[pos * 2 + 1];
}
return pos;
}
public int getParentOfNode(int node) {
int pos = getPositionOfNode(node);
if(pos != -1) {
return tree[pos / 2];
}
return pos;
}
}
在此结构中,如果某个节点位于位置i,则其子节点将位于2 * i和2 * i + 1的位置。
答案 4 :(得分:0)
public class TwoDArray {
private Object[] values;
public TwoDArray(int n, int m) {
values = new Object[n * m];
}
public void set(int i, int j, Object x) { ... }
public Object get(int i, int j) { ... }
}
public class BinTree {
private BinTree left;
private BinTree right;
private Comparable value;
public void insert(Comparable x) { ... }
}
这样的东西? 不应该那么困难。
答案 5 :(得分:0)
我首先假设您已被禁止使用甚至Java的原始数组类型。在这种情况下,您将不得不回到基础并开始自己管理内存。您需要从分配适当大小的字节数组或ByteBuffer开始。然后,使用C中的内容直接指针数学来处理对该数据块的访问。
16个整数的1D数组示例:
byte[] mem = new byte[16 * 4] ; // Ints are 4 bytes long
// Write a value to the 8th element of our "array"
index = 8 ;
int value = 31415926 ;
mem[4 * index + 0] = (byte)( value >> 24 ) ;
mem[4 * index + 1] = (byte)( ( value << 8 ) >> 24 ) ;
mem[4 * index + 2] = (byte)( ( value << 16 ) >> 24 ) ;
mem[4 * index + 3] = (byte)( ( value << 24 ) >> 24 ) ;
读出一个值就可以反转过程并计算存储的int值。
注意:使用ByteBuffer设置和检索值的过程更容易,因为它是获取原始Java类型并将其放入字节数组的方法。