我需要编写一个函数,在二叉搜索树中返回其大小的第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--);
}
}
请问任何想法?
答案 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,最坏情况时间仍然是线性的。不过,它比普通情况更快。