增加一下难度:任意二叉树的第k小的节点
二叉搜索树的第k个结点
http://www.nowcoder.com/questionTerminal/ef068f602dde4d28aab2b210e859150a
如果是二叉搜索树的话可以利用其性质直接中序遍历即可
如果是任意二叉树的话,这让我联想到了求一个数组的第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; } }