题目:给定一颗二叉搜索树,请找出其中的第k大的结点。
/*
解题思路:通过中序遍历二叉搜索树,找到第k大的节点的值temp,然后通过层次遍历二叉搜索树,找到值为
temp的节点,并且返回该节点
注意考虑:1 二叉搜索树为空,或者k为0则直接返回null;
2 k的值大于二叉搜索树的节点个数,则返回null
*/
TreeNode KthNode(TreeNode pRoot, int k)
{
if(k==0||pRoot==null){//k为0或者二叉搜索树为空
return null;
}
StringBuilder sb=new StringBuilder();
midOrder(pRoot,sb);//中序遍历二叉搜索树,得到有序的字符串
String[] strs=sb.toString().split("!");//将字符串分解成字符串数组
if(k>strs.length){//如果k的值大于二叉搜索树的节点的个数,返回空
return null;
}
int temp=Integer.parseInt(strs[k-1]);//找到该二叉搜索树第k大的值
TreeNode result=null;
//层次遍历该二叉树
LinkedList<TreeNode> node=new LinkedList<TreeNode>();
node.add(pRoot);
while(node.size()!=0&&node!=null){
TreeNode stemp=node.remove();
if(stemp.val==temp){
result=stemp;
break;
}else{
if(stemp.left!=null){
node.add(stemp.left);
}
if(stemp.right!=null){
node.add(stemp.right);
}
}
}//while
return result;
}
//中序遍历
public void midOrder(TreeNode root,StringBuilder sb){
if(root==null){
return;
}
midOrder(root.left,sb);
sb.append(root.val).append("!");
midOrder(root.right,sb);
}