我已从c ++切换到c#。我正在使用链接列表,其中包含如下节点:(按升序排序)
1->1->1->44->46->48->49->50->null
我要做的是:
(1)添加前两个节点。 (2)将获得的一些放在最后一个节点上。 所以,在第一次添加之后,LList将是:(1 + 1 = 2)
1->1->1->44->46->48->49->50->2->null
(3)再次添加两个最小节点并将总和放在最后一个节点上(但不要添加已添加的节点)。
(4)这次两个最小值是1和2,因为" 1"和" 1"(前两个)已经添加。 LList现在成为:
1->1->1->44->46->48->49->50->2->3->null
(5)现在两个最小值分别是3和44,所以
1->1->1->44->46->48->49->50->2->3->47->null
(6)现在两个最小值分别为46和47(最后我们有47个,其中第二个最小),所以 1→1→1→44-> 46-> 48-> 49-> 50- GT; 2→3→47-> 93->空 (7)现在48和49,所以
1->1->1->44->46->48->49->50->2->3->47->93->97->null
(8)下一个最小值是" 50"和" 93"是这样,
1->1->1->44->46->48->49->50->2->3->47->93->97->143->null
(9)最后: 剩下97和143,所以
1->1->1->44->46->48->49->50->2->3->47->93->97->143->240->null
只剩下一个元素(240)所以停在这里。
有人可以帮我制作它的算法吗?谢谢
我的想法:实现这个算法是:这里" freq"包含值,左右都像树左右。
while (front != rear)
{
if (counter == 0)
{
Console.WriteLine("check1");
temp = new Node();
temp.freq = front.freq + front.next.freq;
front.is_processed = 1;
front.next.is_processed = 1;
temp.is_processed = 0;
temp.left = front;
temp.right = front.next;
temp.next = null;
rear.next = temp;
front = front.next.next;
rear = rear.next;
remaining = count_remaining();
if (remaining == 1)
{
break;
}
}
if (rear.freq.Equals(front.freq))
{
Console.WriteLine("check2");
temp = new Node();
temp.freq = front.freq + rear.freq;
rear.is_processed = 1;
front.is_processed = 1;
temp.is_processed = 0;
temp.left = front;
temp.right = rear;
temp.next = null;
rear.next = temp;
rear = rear.next;
remaining = count_remaining();
if (remaining == 1)
{
break;
}
}
if (rear.freq < front.freq)
{
Console.WriteLine("check3");
Node pmin1 = null;
Node pmin2 = null;
front_rear(ref pmin1, ref pmin2);
temp = new Node();
temp.freq = pmin1.freq + pmin2.freq;
pmin1.is_processed = 1;
pmin2.is_processed = 1;
temp.is_processed = 0;
temp.left = pmin2;
temp.right = pmin1;
temp.next = null;
rear.next = temp;
rear = rear.next;
remaining = count_remaining();
if (remaining == 1)
{
break;
}
}
if (rear.freq > front.freq)
{
Console.WriteLine("check4");
Node pmin1 = null;
Node pmin2 = null;
front_rear(ref pmin1, ref pmin2);
temp = new Node();
temp.freq = pmin1.freq + pmin2.freq;
pmin1.is_processed = 1;
pmin2.is_processed = 1;
temp.is_processed = 0;
temp.left = pmin2;
temp.right = pmin1;
temp.next = null;
rear.next = temp;
rear = rear.next;
remaining = count_remaining();
if (remaining == 1)
{
break;
}
}
counter++;
}
但令人惊讶的是它会打印出来:(它根本不会去&#34; check3&#34;这是if (rear.freq < front.freq)
你可以看到我上面的step5处于这种情况但是不打印{ {1}})
check3
为什么它只是处于条件check1
check4
check4
check4
check4
check4
check4
?(它实际上是使用链表的树),其中父节点是两个最小节点的总和。
答案 0 :(得分:2)
你的代码真的很草率,所以我给你一个基本框架来使用
Node first = FindLowestUnprocessedNode();
Node second = FindLowestUnprocessedNode();
while(first != null && second != null)
{
Node sumNode = new Node(first, second)
AddToEndOfList(sumNode);
Node first = FindLowestUnprocessedNode();
Node second = FindLowestUnprocessedNode();
}
以下是您自己制作的一些功能。这些不应该太难
FindLowestUnprocessedNode(...)
:找到最低的未处理节点并将其标记为已处理。如果处理了所有节点,则返回null
。您可能会发现要为此方法添加额外参数。
Node(Node first, Node second)
:将此构造函数添加到Node
类。它应该将节点初始化为左侧为first
,右侧为second
,它的freq
应为first.freq
和{{1}的总和}}
second.freq
:将节点添加到列表的末尾。
请注意,这些只是抽象的占位符方法,您可以并且可能应该为它们添加额外的参数,或者如果您认为它会帮助您,则将它们变为实例方法。