2017-04-25 30 views
1

叶对此的解释是有点迷惑我,叶的决心堆堆:确定C++

“通知我们如何可以检测堆一个节点是否为叶若。堆中的项数至少为n,但小于2 * n + 1,那么带下标n的节点就是这个二叉树上的一个叶。

例如:

VAL | 5 | 3 | 4 | 2 |

ind | 0 | 1 | 2 | 3 |

所以在数组中有4个元素,当我滴入元素2时,我应该停止对吗?

因为从等式2 * n + 1,意思是根是2 *根+ 1并且必须小于总节点,对吗?

谢谢!

+0

你的问题缺少了很多背景。例如,什么是_“堆”。提出的问题假设我们知道只有一个可能的堆实现 - 有很多。 –

+3

@RichardCritten [什么,你从来没有见过Fraggle Rock?](https://en.wikipedia.org/wiki/List_of_Fraggle_Rock_characters#Marjory_the_Trash_Heap) – user4581301

回答

0
n = 0 Is the heap at least n?  Yes 
     Is the heap less than 2*n+1? No 
n = 1 Is the heap at least n?  Yes 
     Is the heap less than 2*n+1? No 
n = 2 Is the heap at least n?  Yes 
     Is the heap less than 2*n+1? Yes 

通过归纳,你可以知道n=2之后的所有内容也是叶节点。反过来思考这个问题,如果你发现最后一个节点的父节点,你就会知道每个后面的元素都是一个叶节点。因此,最后的非叶节点是索引(3-1)/2 = 1

+1

我在想如果堆中有四个节点。在级别2处,节点#1将不是叶子,因为2 * 1 + 1 = 3这是<4,所以节点#1不是叶子。但是对于节点#2,在同一级别上,2 * 2 + 1 = 5,其中i> 4。因此节点#2是叶子,因为堆中没有节点#5。与节点#3相似。 –

+0

你的想法绝对正确。 – Alden