题目描述
时间限制:1秒 空间限制:32768K
给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
解题思路
刚开始觉得第k大的结点不是从大到小排序的第k个吗,然而题目好像是第k小,不管怎样,解题思路很简单:
(1)第k小(本题):二叉树中序遍历,第k个
(2)第k大:跟二叉树中序遍历相反,即先遍历右子树,然后访问当前结点,最后遍历左子树。
代码(Java)
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class Main {
//当前访问结点的个数
public static int index = 0;
//第k个结点
public static TreeNode ans = null;
public static void dfs(TreeNode root, int k) {
if(index >= k)return ;
//遍历左子树
if(root.left != null)dfs(root.left, k);
index++;
//找到第k个结点
if(index == k)ans = root;
//遍历右子树
if(root.right != null)dfs(root.right, k);
}
public static TreeNode KthNode(TreeNode pRoot, int k)
{
if(pRoot == null)return null;
dfs(pRoot,k);
if(index < k)return null;
return ans;
}
/*
测试代码
*/
public static void main(String []args){
}
}