您的位置:首页 > 编程语言 > Java开发

leetcode oj java 230. Kth Smallest Element in a BST

2017-01-17 22:41 267 查看
一、问题描述:

Given a binary search tree, write a function 
kthSmallest
 to find the kth
smallest element in it.

Note: 

You may assume k is always valid, 1 ≤ k ≤ BST's total elements.

二。1、解决思路:

由于BST的左孩子节点的值都小于父节点,右孩子节点的值都大于父节点的特性,我们可以递归的去寻找K小的元素。

假设左子树的长度是length

如果 length + 1 = k 那么刚好是根节点的值

如果 length + 1 > k 那么结果在左子树中,还是寻找第k个。

如果
length + 1 < k 那么结果在右子树中,此时已经排除了左边的length+1 个,需要寻找k-(length+1)个。

附代码:

public static int kthSmallest(TreeNode root, int k) {
if (root == null) {
return 0;
}
int leftSize = count(root.left);
if (k == leftSize + 1) {
return root.val;
} else if (k < leftSize + 1) {
return kthSmallest(root.left, k);
} else {
return kthSmallest(root.right, k - leftSize - 1);
}
}

public static int count(TreeNode root) {
if (root == null) {
return 0;
}
return 1 + count(root.left) + count(root.right);
}


解决思路二:

中序遍历树,把结果存入list中,一旦list的长度大于K的时候就返回。然后取list的第k-1个值即可。

代码:

public static int kthSmallest(TreeNode root, int k) {
List<Integer> re = new ArrayList<Integer>();
bianli(root, re, k);
return re.get(k - 1);
}

public static List<Integer> bianli(TreeNode root, List<Integer> re, int k) {
if (root == null || re.size() > k) {
return re;
}
bianli(root.left, re, k);
re.add(root.val);
bianli(root.right, re, k);
return re;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: