如果是二叉搜索树的话可以利用其性质直接中序遍历即可
如果是任意二叉树的话,这让我联想到了求一个数组的第K小的数字
利用最大堆来实现:
Java提供的PriorityQueue默认是最小堆,因此需要传入一个比较器变为最大堆
import java.util.*;
public class Solution {
PriorityQueue<TreeNode> maxHeap = new PriorityQueue<>(new maxComparator());
public TreeNode KthNode(TreeNode pRoot, int k)
{
if(pRoot==null) return null;
if(k==0) return null;
preFind(pRoot,k);
if(maxHeap.size()<k) return null;
return maxHeap.peek();
}
public void preFind(TreeNode head, int k){
if(head==null) return ;
if(maxHeap.size()<k){//始终保证最大堆中只有K个节点
maxHeap.offer(head);
}else{
if(head.val<maxHeap.peek().val){
maxHeap.poll();
maxHeap.offer(head);
}
}
preFind(head.left,k);
preFind(head.right,k);
}
}
class maxComparator implements Comparator<TreeNode>{
@Override
public int compare(TreeNode t1,TreeNode t2){
return t1.val>=t2.val?-1:1;
}
}


京公网安备 11010502036488号