Java 把父母安置在树上
我有一个哈夫曼二叉树,它以一个空节点a开始 A指向左节点和右节点,这两个节点也指向左节点和右节点。拥有此树后,是否可以递归地为每个节点设置父节点 这就是我所想的代码:Java 把父母安置在树上,java,tree,binary-tree,huffman-code,Java,Tree,Binary Tree,Huffman Code,我有一个哈夫曼二叉树,它以一个空节点a开始 A指向左节点和右节点,这两个节点也指向左节点和右节点。拥有此树后,是否可以递归地为每个节点设置父节点 这就是我所想的代码: public Node setParents(Node n) { if(n.getZero() == null && n.getOne() == null) { return n; } Node a = setParents(n.getZero()); // Zero
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;
}
公共节点createTree(优先级队列pq)
{
而(pq.size()>1)
{
节点n=新节点();
节点a=pq.poll();
如果(pq.size()>0)
{
节点b=pq.poll();
n=新节点(a.getFrequency()+b.getFrequency());
n、 设定零(a);
a、 setWhich(0);
a、 setParent(n);
n、 setOne(b);
b、 设定值(1);
b、 setParent(n);
}
其他的
{
n=新节点(a.getFrequency());
n、 设定零(a);
a、 setWhich(0);
n、 setParent(n);
n、 setOne(空);
}
pq.添加(n);
}
节点n=pq.poll();
n、 setParent(空);
setParents(n.getZero());
setParents(n.getOne());
返回n;
}
我只需要确保每个节点都有一个父节点,我不知道从这里开始。。有什么帮助吗?对代码的一些注释可能会有所帮助 一,。不要在学习样本中使用getter和setter来完成简单的作业和阅读,因为它们很难理解 二,。如果你准备了一些物品,不要把这些物品和其他物品混在一起
n.setZero(a);
a.setWhich(0);
a.setParent(n);
n.setOne(b);
三,。据我所知,有机会获得NPE
if(pq.size() > 0) {
Node b = pq.poll();
}
}
Node n = pq.poll();
n.setParent(null); <- n can be null
下面是如何从根开始设置父级
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);
}
}
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);
}
}