【问题标题】:Returning an element with a specific rank k in a binary tree返回二叉树中具有特定秩 k 的元素
【发布时间】:2018-06-14 22:39:54
【问题描述】:

我已经用伪代码实现了一个方法 rankOfElement(x),它返回给定节点 x 的排名:

function rankofElement(x) {
    rank = 0; 
    Node temp = root;

    while (temp.key != x) {
       if (x < temp.key) {
          temp = temp.leftson
       } else if (x > temp.key) {
          rank += temp.leftson.size + 1;
          temp = temp.rightson;
       } else if (temp.key == x) {
          return rank + temp.leftson.size
       } else return "key not found"
   }

现在我应该用伪代码实现一个方法 (elementbyRank(k)),它在二叉树的上下文中返回一个具有特定等级 k 的节点。 我正在为此苦苦挣扎,希望您能给我一个答案。

【问题讨论】:

    标签: binary-tree binary-search-tree rank


    【解决方案1】:

    因此,如果给定等级 k 并且我们需要找到具有给定等级的节点,我们首先需要一个遍历算法来搜索树。预购遍历应该可以正常工作。这是一个递归的。

    function preOrderTraversal(node){
        if(node !== null){
            print(node.data);
            preOrderTraversal(node.left);
            preOrderTraversal(node.right);
        }
    }
    

    现在我们有办法通过我们的树,我们需要实现elementbyRank 方法并修改遍历算法。我们将检查每个节点的排名,而不是打印数据。我们需要通过我们需要找到的排名,我们需要在遍历中添加一个返回。

    elementbyRank 方法非常简单:

    function elementbyRank(k){
       return preOrderTraversal(root, k);    
    }
    

    现在我们需要对 prePrderTraveral 进行更改,并将名称也更改为 elementbyRankTraversal。

    function elementbyRankTraversal(node, key){
        if(node !== null){
            if(key == rankofElement(node.key))
                return node;    
    
            return elementbyRankTraversal(node.left);
            return elementbyRankTraversal(node.right);
        }
        return null;
    }
    

    所以现在如果我们找到一个具有传入排名的节点,我们将取回该节点。但如果一个不存在,我们将得到一个空值。

    我知道你说给定node xrankofElement(x) 将返回元素的排名。但是您将node's key 直接与x 进行比较,这告诉我x 不是nodexkey of node x。如果我错了,那么只需从elementbyRankTraversal() 中删除关键部分。

    这应该可行。

    【讨论】:

    • 感谢您的回答。我很确定您的解决方案会起作用,但我应该提到该方法应该在 O(h) 时间内起作用,其中 h 是二叉树的高度。在您的解决方案中,最长时间为 O(h^2)。
    • 好吧,困难的部分已经不碍事了。我建议让每个节点存储它的排名,然后使用 O(n) 的遍历算法来找到所需的排名。这会给您的插入和删除方法增加一点复杂性,但它会完成工作。
    猜你喜欢
    • 2018-11-25
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多