使用 C++ 打印最小堆中小于给定值 x 的所有节点
在这个问题中,我们给定一个最小堆和一个值x,我们需要打印所有小于 x 的节点。
最小堆是一种特殊的二叉树,其中每个节点的值都小于其子节点的值。
让我们举个例子来理解这个问题:
X = 45
输出: 2 4 7 10 17 22 33 34
现在,为了解决这个问题,我们需要对整个最小堆进行先序遍历,并只打印小于给定值 X 的那些值。如果节点的值大于 x,那么我们将不会遍历其子节点,因为它们的值也将大于 x。我们将使用递归来进行最小堆的先序遍历。
示例
程序演示了我们解决方案的工作原理
#include <iostream> using namespace std; class MinHeap { int* harr; int capacity; int heap_size; public: MinHeap(int capacity); void Heapify(int); int parent(int i) { return (i - 1) / 2; } int left(int i) { return (2 * i + 1); } int right(int i) { return (2 * i + 2); } void insert(int k); void printSmallerNodes(int k, int pos); }; void MinHeap::printSmallerNodes(int x, int pos = 0){ if (pos >= heap_size) return; if (harr[pos] >= x) { return; } cout<<harr[pos]<<" "; printSmallerNodes(x, left(pos)); printSmallerNodes(x, right(pos)); } MinHeap::MinHeap(int cap) { heap_size = 0; capacity = cap; harr = new int[cap]; } void MinHeap::insert(int k) { if (heap_size == capacity) { cout << "\nOverflow! Size Full\n"; return; } heap_size++; int i = heap_size - 1; harr[i] = k; while (i != 0 && harr[parent(i)] > harr[i]) { swap(harr[i], harr[parent(i)]); i = parent(i); } } void MinHeap::Heapify(int i) { int l = left(i); int r = right(i); int smallest = i; if (l < heap_size && harr[l] < harr[i]) smallest = l; if (r < heap_size && harr[r] < harr[smallest]) smallest = r; if (smallest != i) { swap(harr[i], harr[smallest]); Heapify(smallest); } } int main() { MinHeap h(50); h.insert(2); h.insert(4); h.insert(7); h.insert(34); h.insert(52); h.insert(33); h.insert(10); h.insert(51); h.insert(75); h.insert(17); h.insert(22); int x = 45; cout<<"All nodes with value smaller than "<<x<<" are\n"; h.printSmallerNodes(x); return 0; }
输出
All nodes with a value smaller than 45 are 2 4 34 17 22 7 33 10
广告