1.题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
2.解题思路
方法1:
用PriorityQueue将所有结点放到queue中,再依次弹出里面的数据(队首数据依次弹出),弹出的第k个数据就是要求的数值,再将它构建成TreeNode即可。
方法2:
根据二叉搜索树的特点,左子树上的点小于该点,右子树上的点大于该点。所以按照中序遍历的方法得到的序列即是从小到大的序列。
3.代码
方法1:
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
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:
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++;
//找到第K个结点
if(k==index){
node=pRoot;
return node;
}
KthNode(pRoot.right,k);
return node;
}
}