我有一个以空节点a。
开头的霍夫曼二叉树指向左节点和右节点,指向左节点和右节点。有这个树后,是否可以递归地为每个节点设置父节点?
这是我想的代码:
public Node setParents(Node n)
{
if(n.getZero() == null && n.getOne() == null)
{
return n;
}
Node a = setParents(n.getZero()); // Zero being left
a.setParent(n);
Node b = setParents(n.getOne()); // One being right.
b.setParent(n);
}
以下是我当前使用优先级队列创建树的方法,其中值排序最小到最大。
public Node createTree(PriorityQueue<Node> pq)
{
while(pq.size() > 1)
{
Node n = new Node();
Node a = pq.poll();
if(pq.size() > 0)
{
Node b = pq.poll();
n = new Node(a.getFrequency() + b.getFrequency());
n.setZero(a);
a.setWhich(0);
a.setParent(n);
n.setOne(b);
b.setWhich(1);
b.setParent(n);
}
else
{
n = new Node(a.getFrequency());
n.setZero(a);
a.setWhich(0);
n.setParent(n);
n.setOne(null);
}
pq.add(n);
}
Node n = pq.poll();
n.setParent(null);
setParents(n.getZero());
setParents(n.getOne());
return n;
}
我只需要确保每个节点都有一个父节点,我不知道从哪里开始..有什么帮助吗?
答案 0 :(得分:0)
对您的代码提出一些可能有帮助的评论
1。不要在研究样本中使用getter和setter进行简单的分配和读取,这些很难理解。
2。如果您准备了一些物品,请不要将此制剂与其他物品混合
n.setZero(a);
a.setWhich(0);
a.setParent(n);
n.setOne(b);
3。根据我的理解,有机会获得NPE
if(pq.size() > 0) {
Node b = pq.poll();
}
}
Node n = pq.poll();
n.setParent(null); <- n can be null
4。 Java有很好的功能,称为Enums for this
a.setWhich(0);
b.setWhich(1);
以下是如何从根
开始设置父项public void fixParents(Node parentNode)
{
if (parentNode.zero != null) {
parentNode.zero.parent = parentNode;
fixParents(parentNode.zero);
}
if (parentNode.one != null) {
parentNode.one.parent = parentNode;
fixParents(parentNode.one);
}
}
<强> UPD 强>
还有一个想法。您可以在树构建功能中设置父项。因此,您应该检查父母是否正确但不重新设置。
public void checkParents(Node parentNode) throws Exception
{
if (parentNode.zero != null) {
if (parentNode.zero.parent != parentNode) {
throw new Exception( here include info about the parentNode.zero );
}
checkParents(parentNode.zero);
}
if (parentNode.one != null) {
if (parentNode.one.parent != parentNode) {
throw new Exception( here include info about the parentNode.one );
}
checkParents(parentNode.one);
}
}