剑指offer的第54道题,给定一棵二叉搜索树,请找出其中第k大的节点。
根据给出的样例数据,可以得出给出的二叉树是满足中序遍历递增序列的。按左、中、右进行遍历的时候是正序,那么按右、中、左进行遍历,则是逆序。因此本次要求找到第k大的节点,则意味着要逆序找到第k个元素。所以定义一个变量i用来记录第i个元素,定义一个value用来记录第k个元素的值。当对二叉树进行遍历的时候,如果i=k时,此时对value,进行赋值。也因此,如果value>0,则意味着循环结束了。具体代码如下。
package learnproject.offer;
/*
* 54.二叉搜索树的第k大节点
*/
public class Demo54 {
/*
*1.从题中可以看出,给出的二叉树是中序遍历递增的
*2.因此要找到第k大的节点,就意味着可以从右、中、左的方向对二叉树进行遍历
* 这就相当于是逆序遍历了
*3.只要遍历到第k个节点返回即可
*
*/
private int value = -1;
public int kthLargest(TreeNode root, int k) {
rescur(root,k);
return value;
}
private int i = 0;
public void rescur(TreeNode node,int k) {
if(node == null || value > 0) {
return;
}
rescur(node.right,k);
i +=1;
if(i == k) {
value = node.val;
}
rescur(node.left,k);
}
public static void main(String args[]) {
Demo54 demo = new Demo54();
TreeNode node1 = new TreeNode(4);
TreeNode node21 = new TreeNode(2);
TreeNode node22 = new TreeNode(5);
TreeNode node31 = new TreeNode(1);
TreeNode node32 = new TreeNode(2);
node1.left = node21;
node1.right = node22;
node21.left = node31;
node21.right = node32;
System.out.print(demo.kthLargest(node1, 1));
}
}