返回二叉搜索树

时间:2016-05-16 09:42:40

标签: java binary-tree binary-search-tree

我需要编写一个函数,在二叉搜索树中返回其大小的第k个值

例如,如果这是二叉搜索树:

                                  50
                                 /  \
                               46    58
                              / \    / \
                            32  48  53  67

然后如果k = 3,那么函数应该返回48

因为48在他的身材中排在第三位。

32,46,48,50,53,58,67。

我的想法是以某种方式使用,但是我已经停留了很长时间,我不认为它应该很难,我需要一个伪代码或更好的代码然后我的。

这是我在JAVA eclipse中所做的:

private static void k_val_inorder(TreeItem x,int k)
{       
    if (x != null&&k!=0)
    {
        k_val_inorder(x.getLeft(),k--);
        System.out.print(x.getKey()+" ");
        k_val_inorder(x.getRight(),k--);        
    }   

}

请问任何想法?

2 个答案:

答案 0 :(得分:1)

给定TreeNode类来实现二叉树:

public class TreeNode {
    int data;
    TreeNode left;
    TreeNode right;

    TreeNode(int data) {
        this.data = data;
    }
}

给定二叉树的中缀遍历:

public void inFix(TreeNode root, List<Integer> inFixRep) {
    if (root != null) {
        inFix(root.left, inFixRep);
        inFixRep.add(root.data);
        inFix(root.right, inFixRep);
    }
}

上述方法填充List<Integer>。此列表包含给定二叉树的中缀表示。要获得第k个节点,只需获取列表中的第(k-1)个元素,如inFixRep.get(k-1)

答案 1 :(得分:0)

Inorder工作但是线性,这可以在log(n)时间内实现。如果跟踪节点子树中包含的节点数,则可以安排一个以对数时间运行的函数。在python中,它看起来像:

def select(node, k):
    if node == null:
        return null
    t = node.left == null ? 0 : node.count
    if t > k:
        return select(node.left, k)
    if t < k:
        return select(node.right, k-t-1)
    return node.data

编辑:

它在log(n)时间内用于平衡树,但是对于标准BST,最坏情况时间仍然是线性的。不过,它比普通情况更快。