在BST的订单列表中获取值的位置(不创建列表)

时间:2015-05-14 20:42:46

标签: java binary-search-tree

我完全坚持这个问题。我需要在顺序列表中输出值的位置(第一个索引0)。需要注意的是,我无法创建列表并对其进行搜索。对于每个节点,我有一个变量,其中包含有关任何给定树(包括根)中有多少节点的信息。我有大约50%的案例工作,但其余的都难以理解......如果价值不存在,我需要将指数返回原处。

在班级树

public int position(int val) {
    if (this.isEmpty()){
        return 0;
    }

    if (val == root.key){
        return (root.subNodes - root.rightchild.subNodes) - 1;
    }

    if (val < root.key){
        return root.position(0,root.subNodes - 1,val,root);
    } else {
        return (root.subNodes - root.rightchild.subNodes) +root.position(0,root.subNodes - 1,val,root.rightchild);
    }

}

在班级节点

int position(int min, int max, int k, Node n){
    if (k == n.key){
        if (n.rightchild != null){
            return n.subNodes - (n.rightchild.subNodes);
        }
        return max;
    }
    if (n.rightchild == null && n.leftchild == null){
        return 1;
    }
    if (k < n.key){
        return position(min ,n.leftchild.subNodes - 1, k, n.leftchild);
    }

    if (k > n.key && n.rightchild != null){
        return position(n.subNodes - (n.rightchild.subNodes + 1), n.subNodes - 1, k, n.rightchild);
    }

    return max;
}

1 个答案:

答案 0 :(得分:0)

理念:

您可以按顺序遍历树,并跟踪您访问过的节点数。这需要某种计数器,可能还有辅助方法。

当我们找到一个值大于或等于所需值的节点时,我们停止搜索。这是因为我们要么找到所需值的索引,要么找到所需值的索引(所需的值不会在任何更早或更晚的索引中)。如果我们从未找到等于或大于所需值的节点,则所需的值将位于树的末尾,其位置等于节点数。

实施:

想象一下,你有这个节点

public class Node {
   int value;
   Node leftChild;
   Node rightChild;

   // Getters and Setters
}

这棵树

public class Tree {
    Node root;

   // Getters and Setters
}

树内

public int position(int val) {
   positionHelper(val, root, 0);
}

public int positionHelper(int val, Node currentNode, int steps) {
   // In-order search checks left node, then current node, then right node
   if(currentNode.getLeftChild() != null) {
       steps = positionHelper(val, currentNode.getLeftChild(), steps++);
   }

   // We found the node or have already moved over the node, return current steps
   if(currentNode.getValue() >= val) {
       return steps;
   }

   // Next Node Index  
   steps++;

   if(currentNode.getRightChild() != null) {
       steps = positionHelper(val, currentNode.getRightChild(), steps++);
   }

   return steps;
}

如果有任何问题或有任何问题,请告诉我