用静态数组实现二叉搜索树的删除函数的写法
用静态数组实现二叉搜索树时遇到一个问题,就是从树中删除某一个特定的值得时候,发现有点困难,因为是静态数组,删除一个节点时其余的孩子节点也要进行移动,尤其是当删除的节点只有一个孩子的时候,时间复杂度有些高,求高人给一个时间复杂度低的方案。
本人的时间复杂度较低的渣渣思想:
附上伪代码:
current = tree_find(value); /*找到要删除的值对应的数组游标*/
if( current节点为叶子节点)
{
直接删除该节点;
}
else
{
if( current节点有两个孩子节点 )
{
找到该节点的左孩子中值最大的节点值赋值给该节点;
并把那个孩子节点置为未使用;
}
else
{//该节点只有一个孩子节点,就是这的效率有点低,因为要一直移动该节点的所有孩子节点。
/*计算那个唯一的孩子节点的游标*/
if( 该节点只有左孩子 )
current_child = curent * 2;
else
current_child = current * 2 + 1;
/*开始顺次移动该节点的孩子节点子树的节点*/
pre_current = current_child;/*记录节点信息*/
tree->values[current] = tree->values[current_child];/*移动要删除的节点第一个孩子节点*/
while(没到每个子树的叶子节点)
{
if( current_child节点有左孩子 )
{
tree->values[ current * 2 ] = tree->values[ current_child * 2 ];
}
if( current_child节点有右孩子 )
{
tree->values[ current * 2 + 1 ] = tree->values[ current_child * 2 + 1];
}
current_child = 获得的原current_child左子树或者右子树的节点;
}
}
}