在二叉搜索树

时间:2016-02-29 06:04:52

标签: java binary-search-tree

我正在为必须返回已删除节点的二叉搜索树实现delete方法。

当删除的节点有两个子节点时,我在返回已删除节点时遇到问题。要删除具有两个子节点的节点,将后继节点复制到已删除节点,并进行递归调用以删除后继节点。后继作为已删除的节点返回,当前调用也返回后继,因为我“删除”了一个实例变量。

我实际上认为更大的问题是删除不应该是实例变量。我把它变成了一个实例变量,因为我的方法需要返回一些东西,并且由于某种原因它总是会到达最后一个return语句。这就是我将“删除”一个实例变量的原因。显然,每次调用覆盖“删除”都不是正确的方法,所以我的“解决方案”并没有真正让我到处都是。有什么指针吗?

// Case 3: internal node, two children
            else {

                BSTNode succ = currRoot.findMin(currRoot, 
                                                currRoot.getRChild());

                // currRoot is a right child
                if (currRoot.getPerson().getKey() >= 
                    parent.getPerson().getKey()) {

                    deleted = new Person(currRoot.getPerson().getName(), 
                                         currRoot.getPerson().getKey());

                    // copying successor to current node
                    currRoot.getPerson().
                             setKey(succ.getPerson().getKey());
                    currRoot.getPerson().
                             setName(succ.getPerson().getName());

                    deleteHelper(currRoot, currRoot.getRChild(), 
                                 succ.getPerson().getKey(), 
                                 succ.getPerson().getName());

                    return deleted;
                }

                // currRoot is a left child
                else {
                    deleted = new Person(currRoot.getPerson().getName(), 
                                         currRoot.getPerson().getKey());

                    // copying successor to current node
                    currRoot.getPerson().setKey(succ.getPerson().getKey());
                    currRoot.getPerson().setName(succ.getPerson().
                                                 getName());

                    deleteHelper(currRoot, currRoot.getRChild(), 
                                 succ.getPerson().getKey(), 
                                 succ.getPerson().getName());

                    return deleted;
                } 
            }
  return deleted; // I don't know why my code reaches here, but I know this is 
                  // what the last recursive call is returning. That's why
                  // I made deleted an instance variable

0 个答案:

没有答案