【问题标题】:How to calculate parent based on successor in Binary Search Tree (BST)如何根据二叉搜索树(BST)中的后继计算父级
【发布时间】:2015-11-10 23:05:46
【问题描述】:

正如标题所暗示的,如果我们在二叉搜索树 (BST) 中有节点 x,并且我们知道 x.successor 而不是 x.parent 的信息,我们也知道 x.left 和 x.right。如何根据以上信息计算x.parent。

我决定分两种情况来分析:(根高度为0)

  1. 如果 x 没有右孩子,x.successor 的高度必须小于 x。换言之,x.successor 位于 x 的“上层”。
  2. 如果 x 有右孩子,x.successor 的高度必须大于 x。这意味着 x.successor 处于 x 的“较低级别”。

对于第一种情况,我们可以有以下伪代码。

y = x.succ
if x.right == NIL
     z = y.left
     while x != z
         y = z;
         z = z.right
return z

如何处理第二种情况?如果x.right != NIL 会发生什么?

                        15

             6                       18
         3       7              17        19
       2   4       13                         20
                 9

如何获取节点 18 和 19 的父节点,因为最右边的节点 20 没有后继节点,所以它会返回 NIL。

【问题讨论】:

    标签: algorithm data-structures binary-search-tree


    【解决方案1】:

    我们无法始终根据您的信息获取父母。 例如,2 个节点,nodeOne.right = x 我们只知道 x left = null, right = null, successor = null 我们无法检索 nodeOne

    当 x 不在最右边的分支时,我们可以得到父级(这意味着它有一些祖先,其左分支包含 x)。

    算法可能是:

    继续寻找合适的儿子,合适的孙子,...,直到没有 然后得到后继者,进入你的代码(你的代码有点错误?)

    function getParent(Node node){
       Node right = node;
       for(;right.right != null; right = right.right){
       }
       Node successor = right.successor;
       if (successor == null)
         return null;
    
       if (successor.left == node)
         return successor;
    
       for(Node p = successor.left; p!= null; p=p.right){ 
         if (p.right == node){
           return p;
         }
       }
       return null;  
    }
    

    【讨论】:

    • 如何获取节点18、19的父节点。他们最右边的继任者为空。
    • 对不起,节点 18、19 在哪里?正如我已经提到的,父母并不总是能够被收回。仅在某些情况下有效
    • 请看上面的BST,节点18和19最右边的节点20没有后继。 @lucian
    • 如果我们只有节点 19、节点 20 的信息,我们永远找不到节点 18。我认为重点是:您的上述问题并不总是有解决方案。信息不够。考虑重新陈述您的问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 2019-04-09
    • 2012-05-13
    • 1970-01-01
    • 2020-06-11
    • 2013-01-08
    • 1970-01-01
    相关资源
    最近更新 更多