剑指offer_【62】二叉搜索树的第K个结点

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
/*
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:

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;
}



}
文章目录
  1. 1. 1.题目描述
  2. 2. 2.解题思路
  3. 3. 3.代码
| 139.6k