采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师你好,堆的siftdown的终止条件while(leftChild(k) < data.getSize())我实在没懂,如果此时索引为k的节点不是叶子节点,那他就会有叶子节点,而所有节点的的索引不都是小于等于data.size吗? 麻烦你给我讲讲你这终止条件是个啥逻辑,谢谢!
在我们的leftChild方法中,没有判断k是否存在左孩子节点,其实只是返回2*k+1而已。所以这个判断条件的意思是,如果k的左孩子节点的索引2*k+1 >= data.size()的话,说明k已经是叶子节点了(因为他的左孩子节点越界了),说明我们已经来到了整棵完全二叉树的底部:)
加油!:)
假定现有一个15个节点的完全二叉树,索引为k=3的节点的左孩子的索引为7,此时也满足,leftChild=7<size=15,而此时索引为3的节点深度为2,这棵树的深度为3,此时这节点并不是叶子节点呀。
不是啊,所以不能退出循环,要继续这个shiftDown的过程啊:)实际做一个测试用例,跟进程序里看一看?:)
老师您说:“所以这个判断条件的意思是,如果k的左孩子节点的索引2*k+1小于data.size()的话,说明k已经是叶子节点了(因为他的左孩子节点越界了)” 这里应该说反了,因为这个判断条件是写在 while 中的,这里的意思应该是 当 leftChild(k) < data.getSize() 时,此时的 k 索引位置还不是叶子节点,所有进到 while 循环里处理吧:)
登录后可查看更多问答,登录/注册
动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…
10.3k 16
1.4k 17
1.3k 14
1.2k 14