remove中的一些问题

来源:7-7 基于二分搜索树的映射实现

Ethan_Qjm

2020-04-22

// 从二分搜索树中删除键为key的节点
    @Override
    public V remove(K key){

        Node node = getNode(root, key);
        if(node != null){
            root = remove(root, key);
            return node.value;
        }
        return null;
    }

    private Node remove(Node node, K key){

        if( node == null )
            return null;

       ........

老师这里的代码,如果在上面的remove中已经判断node是否为空,那么进入递归函数的条件是node不为空,为什么递归函数的其中一个终止条件还要判断新的node是否为空呢?这样不是永远不会有if(node == null)的情况出现吗?

写回答

1回答

liuyubobobo

2020-04-22

上面的 node 和下面的 node 不是一个东西。


上面的 node 是我们先找到待删除节点对应的 node,我们要确认这个待删除节点是存在的,才能进行删除。可能换个名字,叫 delNode,更清晰,是待删除节点。


但下面的 node,是函数的一个参数名,这个参数名 node 所对应的节点,是跟着我们递归过程传的参数不同而在改变的。比如,在初始点用的时候,我们调用的是 remove(root, key),那么进入这个函数,这个 node 指的是 root。


下面函数的这个 node 在怎么变化,是理解这个删除过程的关键。我建议你实际创建一棵树,3 层就可以,然后删除一个叶子节点,使用单步跟踪的方式实际看一下,递归的 remove 函数中,node 是在怎么变化的。结合这个课程中我讲链表的递归删除的微观操作,理解一下这个过程。


加油!:)

0
7
Ethan_Qjm
好的,谢谢老师
2020-05-20
共7条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程