谢谢!你的方法我已经用在插入算法中了。
template<class T>
MaxHeap<T>& MaxHeap<T>::Insert(const T& x) {//把x插入到最大堆中
int k = (int) (log(state) / log(2)) + 1;//树的层数,state是当前堆的节点数目
int index = state - (int) (pow(2, k - 1) - 1);//最后节点的位置
int p_index = index / 2 + 1;//父节点从左至右的位置
BinaryTreeNode<T> *temp = new BinaryTreeNode<T> (x);
last = temp;//last指针指向最后一个节点
if (index == (int) (pow(2, k - 1))) {//当前层已满
p_index = 1;//父节点设为当前层的第一个节点
ConditionOrder(root, k, p_index, temp);
} else
ConditionOrder(root, k - 1, p_index, temp);
return *this;
}
template<class T>
void MaxHeap<T>::ConditionOrder(BinaryTreeNode<T> *u, int k, int i,
BinaryTreeNode<T> *temp) { //根据参数条件遍历堆
//如果当前节点的子树有一为空,把temp设为其子树
int half = (int) pow(2, k - 2);//堆的第k层应有节点总数的一半
if (u->data < temp->data) {//要插入的元素比当前节点大
Swap(u->data, temp->data);
}
if (!u->LeftChild || !u->RightChild) {//左右子树有一为空,在此加入节点
if (!u->LeftChild) {//左子树为空
u->LeftChild = temp;//加入新节点
state++;//节点数目加1
} else {//右子树为空
u->RightChild = temp;
state++;//节点数目加1
}
} else {
if (i <= half)//左子树
ConditionOrder(u->LeftChild, k - 1, i, temp);
else
//右子树
ConditionOrder(u->RightChild, k - 1, i - half, temp);
}
}