链接列表在树的最后一个节点添加两个最小值

时间:2014-03-24 15:39:54

标签: c# algorithm data-structures

我已从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 (它实际上是使用链表的树),其中父节点是两个最小节点的总和。

1 个答案:

答案 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:将节点添加到列表的末尾。

请注意,这些只是抽象的占位符方法,您可以并且可能应该为它们添加额外的参数,或者如果您认为它会帮助您,则将它们变为实例方法。