05-树7 堆中的路径 (25 分)

Posted interim

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了05-树7 堆中的路径 (25 分)相关的知识,希望对你有一定的参考价值。

05-树7 堆中的路径 (25 分)

将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。

输入格式:

每组测试第1行包含2个正整数N和M(1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的N个要被插入一个初始为空的小顶堆的整数。最后一行给出M个下标。

输出格式:

对输入中给出的每个下标i,在一行中输出从H[i]到根结点的路径上的数据。数字间以1个空格分隔,行末不得有多余空格。

输入样例:

5 3
46 23 26 24 10
5 4 3

输出样例:

24 23 10
46 23 10
26 10


题目要求是插入法

我没注意到,写了两个方法.

自己尽量写的同时,参照了 讲座中的,c语言版本
人家写的代码真是简洁啊,一句多余的都没有.

不知道人家的代码,是随手写的?还是斟酌了很久改成的.


using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Net;
using System.Text;
using System.Xml;

class T
{



    static void Main(string[] args)
    {

        var a = Console.ReadLine();
        var b = Console.ReadLine();

        List<int> list = new List<int>();
        //加入哨兵
        list.Add(int.MinValue);
        if (true)
        {
            插入法(b, list);

        }
        else
        {
            foreach (var item in b.Split( ))
            {
                list.Add(int.Parse(item));

            }

            for (int i = list.Count - 1; i > 0; i--)
            {
                交换(i, list);
            }
        }

        var c = Console.ReadLine();
        StringBuilder sb = new StringBuilder();
        foreach (var item in c.Split( ))
        {
            var v = int.Parse(item);
            while (v != 0)
            {
                sb.Append(list[v] + " ");
                v = v / 2;
            }
            Console.WriteLine(sb.ToString().Trim());
            sb.Clear();

        }




        return;



    }

    private static void 插入法(string b, List<int> list)
    {
        foreach (var item in b.Split( ))
        {

            var v = int.Parse(item);
            list.Add(v);
            int ch = list.Count - 1;

            for (; v < list[ch / 2];)
            {

                var p = ch / 2;
                list[ch] = list[p];
                ch = p;
            }
            list[ch] = v;

        }
    }

    static void 交换(int i, List<int> list)
    {

        while (i * 2 < list.Count)
        {
            int child = i * 2;

            if (child + 1 < list.Count)
            {
                if (list[child] > list[child + 1])
                {
                    child++;

                }

            }

            if (list[i] >= list[child])
            {
                var temp = list[child];
                list[child] = list[i];
                list[i] = temp;
                i = child;

            }
            else
            {
                return;
            }
        }
    }

}

 














以上是关于05-树7 堆中的路径 (25 分)的主要内容,如果未能解决你的问题,请参考以下文章

堆中的路径

05-树7 堆中的路径

05-树7 堆中的路径

7-5 堆中的路径

数据结构树 —— 编程作业 09 :堆中的路径

数据结构荣誉课--第三次实验解题报告