我需要为大学作业编写一个Huffman压缩文本。 练习分为多个点,其中一个是从给定的排序arrayList创建一个二叉树,类型为TreeNode,这个类看起来像这样(我删除了方法boddies):
public class TreeNode implements Comparable<TreeNode>, Serializable {
private byte value;
private int frequency;
private TreeNode left, right;
/** Creates new TreeNode .. must get initialized with value */
public TreeNode(byte value) {
this(value, 0, null, null);
}
/** Creates new TreeNode with full init */
public TreeNode(byte value, int frequency, TreeNode left, TreeNode right) {
this.value = value;
this.frequency = frequency;
this.left = left;
this.right = right;
public void incFrequency()
public int getFreq()
public Byte getValue()
public TreeNode getLeft()
public TreeNode getRight()
public boolean isLeaf()
public int getSubTreeSize()
public void toHeap(byte[] heap, int myIndex)
public void initLookup(long myCode, int myDepth, Map<Byte, BitCode> lookupTable)
@Override
public int compareTo(TreeNode o)
@Override
public String toString()
public void printSubTree(PrintStream out, int tabs)
public void write(BitStream bs)
public static TreeNode read(BitStream bs)
}
我需要从TreeNode类型的arrayList创建二叉树,arrayList按值排序,因此我可以假设具有smalles值的元素位于索引位置0。 树必须满足一个重要条件: 具有下一个较大值的元素需要附加在左侧,而具有更大值的元素需要附加到右侧(树将始终构建在右侧)。
我尝试解决这个问题的方法是遍历列表,获取项目,然后将每个带有奇数索引的项目附加到上一个节点的左侧离开,并将每个项目带有偶数索引到右侧离开。 / p>
有更优雅的方式来解决这个问题吗? (我不要求你为我做功课,但我可能需要一些想法)
编辑: 我需要保留SortedList,因为它是练习规范的一部分
答案 0 :(得分:0)
只是为了帮助你,你可以按照以下思路思考:
编辑我的答案,因为我最初没有正确理解这些要求。
第一次编辑 - 你可以这样做 - 0.如果没有元素,则返回 1.将第一个元素作为你的根。 2.如果它存在为左子,则生成下一个元素。 3.递归调用函数使其结果成为正确的子项。
答案 1 :(得分:0)
经过一番头痛后,我终于找到了解决这个问题的方法。
我的代码如下所示:
private void initializeTree(List tree) {
do{ TreeNode left = tree.remove(0); TreeNode right = tree.remove(0); tree.add(new TreeNode((byte)0, left.getFreq() + right.getFreq(), left, right)); Collections.sort(tree); }while(tree.size() > 1); root = tree.get(0); printTree(System.out);
do{ TreeNode left = tree.remove(0); TreeNode right = tree.remove(0); tree.add(new TreeNode((byte)0, left.getFreq() + right.getFreq(), left, right)); Collections.sort(tree); }while(tree.size() > 1); root = tree.get(0); printTree(System.out);
方法print树是一个静态方法,如果这个类只是将树打印到控制台,则根变量是二叉树的根节点。