1.题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
2.解题思路
方法1:
用PriorityQueue将所有结点放到queue中,再依次弹出里面的数据(队首数据依次弹出),弹出的第k个数据就是要求的数值,再将它构建成TreeNode即可。
方法2:
根据二叉搜索树的特点,左子树上的点小于该点,右子树上的点大于该点。所以按照中序遍历的方法得到的序列即是从小到大的序列。
3.代码
方法1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
import java.util.*; public class Solution { PriorityQueue<Integer> queue = new PriorityQueue<>(); TreeNode KthNode(TreeNode pRoot, int k) { preOrderRec(pRoot); if(queue.size()<k ||k <=0) return null; for(int i = 0;i<k-1;i++){ queue.poll(); } return new TreeNode( queue.poll()); } public void preOrderRec(TreeNode root){ if(root!=null){ queue.add(root.val); preOrderRec(root.left); preOrderRec(root.right); } } }
|
方法2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class Solution { int index=0; TreeNode node=null; TreeNode KthNode(TreeNode pRoot, int k) {
if(k==0||pRoot==null) return node; KthNode(pRoot.left,k); index++; if(k==index) { node=pRoot; return node; } KthNode(pRoot.right,k); return node; }
}
|