二叉搜索树结点的删除

2019-07-05  本文已影响0人  GloryXie

二叉搜索树结点的插入是很容易实现的:只要递归遍历,插入合适的位置就行了。而删除要复杂许多。

无左右子树的结点删除

先考虑没有左右子树的情形。这种情形最为容易,找到这个结点,free并返回NULL给上一层结点连接使用就行了。

BinTree* DeleteLeafNode(BinTree *node, ElementType DataNeeded){
    if(node == DataNeeded){
        if(node->left == NULL && node->right == NULL){
            free(node);
            return NULL;
        }
    }else if(DataNeeded < node->data){
        node->left = DeleteLeafNode(Node->left);
    }else{
        node->right = DeleteLeafNode(Node->right);
    }
}

最小值结点/最大值结点的删除

删除一棵树中的最小值结点时,需要记录它的右子树,free结点并返回右子树给上一层进行连接。删除最大值结点也一样,要记录左子树,删除并返回左子树给上一层。

BinTree* DeleteMax(BinTree node){
    if(node->right == NULL){//检查到为最大值时
        BinTree maxsLeft = node->left;
        free(node);
        return maxsLeft;//返回以作为连接使用
    }else{
        node->right = DeleteMax(BinTree->right);
        return node;
    }
}

(此为删除最大值结点)

左右子树均存在的结点删除

以上讨论了对于子树单侧存在的结点的删除。对于子树双侧存在的结点,首先要选取其左子树中的最大值取代它,然后删除左子树中的最大值即可。同理,也可以选取右子树中的最小值取代它并删除原结点。

理论上说,不论是选取左子树的最大值替代,还是右子树中的最小值替代,原树中序遍历的结果是一样的。

上一篇下一篇

猜你喜欢

热点阅读