在二叉树中返回具有特定等级k的元素

时间:2018-06-14 13:59:06

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

我已经在伪代码中实现了一个方法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的节点。 我正在努力解决这个问题,我希望你能给我一个答案。

1 个答案:

答案 0 :(得分: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()中删除关键部分即可。

这应该有效。