给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
//这个代码是普遍性的,二叉树不知道是什么样子的,比如给的这个没说明是什么排序
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Collections;
import java.util.ArrayList;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
Map< Integer, TreeNode>map = new LinkedHashMap<Integer, TreeNode>();
Map< Integer, TreeNode> Kth(TreeNode pRoot, int k){
if(pRoot==null){
return map;
}
if(map.size()<k){
map.put(pRoot.val, pRoot);
}else{
int index=-1;
//这要重点说明一下,再用迭代器迭代遍历时如果删除remove可能会报
//java.util.ConcurrentModificationException异常,所以我记录下来了等遍历完再进行删除替换
for(Integer i:map.keySet()){
if(pRoot.val<map.get(i).val){
if(index<i){
index = i;
}
}
}
if(index>-1){
map.remove(index);
map.put(pRoot.val, pRoot);
}
}
Kth(pRoot.left, k);
Kth(pRoot.right, k);
return map;
}
//入口
TreeNode KthNode(TreeNode pRoot, int k)
{
if(pRoot==null){
return pRoot;
}
if(k<1){
return null;
}
//开始递归
Kth( pRoot, k);
ArrayList< Integer> list= new ArrayList<Integer>();
for(Integer i:map.keySet()){
list.add(i);
}
//如果k大于给的树的结点,那么就没有结果
if(k>list.size()){
return null;
}
Collections.sort(list);
return map.get(list.get(list.size()-1));
}
}