题目

编写一个函数,在最大堆中查找任意元素,并分析其时间复杂度。
要求:
1、 定义最大堆的型HEAP及其基本操作。
2、 定义函数int Find(HEAP H, Elementtype e),查找e是否为堆的元素,如果是,返回该元素在堆中的位置,如果不是,返回0。(提示:利用最大堆的元素特点进行查找,可降低复杂度)
在主函数中首先构建一个二叉树,然后验证所构造的函数。

代码一

#include<iostream>
#define MaxSize 200
using namespace std;
struct HEAP {
   
	int elements[MaxSize];
	int n;
};
void MaxHeap(HEAP& heap) {
   
	heap.n = 0;
}
bool HeapEmpty(HEAP& heap) {
   
	return !heap.n;
}
bool HeapFull(HEAP& heap) {
   
	return heap.n == MaxSize - 1;
}
void Insert(HEAP& heap, int item) {
   
	int i = 0;
	if (!HeapFull(heap)) {
   
		heap.n++;
		i = heap.n;
		while ((i != 1) && (item > heap.elements[i / 2])) {
   
			heap.elements[i] = heap.elements[i / 2];
			i /= 2;
		}
		heap.elements[i] = item;
	}
}
int DeleteMax(HEAP& heap) {
   
	int parent = 1, child = 2;
	int item, tmp;
	if (!HeapEmpty(heap)) {
   
		item = heap.elements[1];
		tmp = heap.elements[heap.n--];
		while (child <= heap.n) {
   
			if ((child < heap.n) && (heap.elements[child] < heap.elements[child + 1]))
				child++;
			if (tmp >= heap.elements[child])break;
			heap.elements[parent] = heap.elements[child];
			parent = child;
			child *= 2;
		}
		heap.elements[parent] = tmp;
		return item;
	}
	return NULL;
}
void print(HEAP& heap) {
   
	for (int i = 1; i <= heap.n; i++) {
   
		cout << heap.elements[i] << endl;
	}
}
int main() {
   
	HEAP heap = HEAP();
	MaxHeap(heap);
	Insert(heap, 93);
	Insert(heap, 87);
	Insert(heap, 79);
	Insert(heap, 67);
	Insert(heap, 54);
	Insert(heap, 74);
	Insert(heap, 43);
	print(heap);
	cout << "插入76" << endl;
	Insert(heap, 76);
	print(heap);
	cout << "删除最大值" << endl;
	DeleteMax(heap);
	print(heap);
}

代码二

#define kMaxSize 200

#include <iostream>
using namespace std;

typedef int elementtype;
typedef struct
{
   
    elementtype elements[kMaxSize];
    int n;
}HEAP;

void MaxHeap(HEAP& heap)
{
   
    heap.n = 0;
    for (int i = 1; i < kMaxSize; ++i)
    {
   
        heap.elements[i] = INT_MIN;
    }
}

bool HeapFull(HEAP heap)
{
   
    return (heap.n == kMaxSize - 1);
}

bool HeapEmpty(HEAP heap)
{
   
    return !heap.n;
}

void Insert(HEAP& heap, elementtype element)
{
   
    if (!HeapFull(heap))
    {
   
        int i = ++heap.n;
        while (i != 1 && (element > heap.elements[i / 2]))
        {
   
            heap.elements[i] = heap.elements[i / 2];
            i /= 2;
        }
        heap.elements[i] = element;
    }
}

elementtype DeleteMax(HEAP& heap)
{
   
    if (!HeapEmpty(heap))
    {
   
        int parent = 1, child = 2;
        elementtype element = heap.elements[1], tmp = heap.elements[heap.n--];
        while (child <= heap.n)
        {
   
            if ((child < heap.n) && (heap.elements[child] < heap.elements[child + 1]))
                ++child; //让child指向两子女中的大者位置
           //根大则不必调整,函数结束
            if (tmp >= heap.elements[child])
                break;        //否则子女中的大者上移
            heap.elements[parent] = heap.elements[child];
            parent = child; //将根下降到子女位置并继续向下整理!
            child *= 2;
        }
        heap.elements[parent] = tmp;
        return element;
    }
    return NULL;
}

int Find(HEAP heap, elementtype element)
{
   
    for (int i = 0; i < heap.n; ++i)
    {
   
        if (heap.elements[i + 1] == element)
        {
   
            return i + 1;
        }
    }
    return 0;
    //int i = 1; // 仅仅适用于 Insert 生成的最大堆,不具有普适性
    //while (i < heap.n)
    //{
   
    // if (heap.elements[i] == element)
    // {
   
    // return i;
    // }
    // else
    // {
   
    // if (heap.elements[2 * i] == element)
    // {
   
    // return 2 * i;
    // }
    // if (heap.elements[2 * i] < element)
    // {
   
    // i = 2 * i + 1;
    // }
    // else
    // {
   
    // ++i;
    // }
    // }
    //}
    //return 0;
}

int main()
{
   
    HEAP heap{
   };
    MaxHeap(heap);
    elementtype a[] = {
    99,88,5,77,66,1 };
    for (elementtype i : a)
    {
   
        Insert(heap, i);
    }
    //DeleteMax(heap);
    for (elementtype i : a)
    {
   
        cout << Find(heap, i) << endl;
    }
}