题目描述
给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
分析
通过中序遍历列出节点顺序列表
更加优化的解决办法是直接在遍历的时候将k值带进去O(k)-O(n)
import java.util.ArrayList;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
TreeNode KthNode(TreeNode pRoot, int k) {
if (pRoot == null) {
return null;
}
ArrayList<TreeNode> list = new ArrayList<TreeNode>();
inOrderTree(pRoot, list);
if (list.size() < k || k == 0) {
return null;
} else {
return list.get(k-1);
}
}
private void inOrderTree(TreeNode pRoot, ArrayList<TreeNode> list) {
if(pRoot == null) {
return;
}
inOrderTree(pRoot.left, list);
list.add(pRoot);
inOrderTree(pRoot.right, list);
}
}
O(k):
int cnt = 0;
TreeNode KthNode(TreeNode pRoot, int k) {
if (pRoot == null)
return null;
TreeNode t = KthNode(pRoot.left, k);
if (t != null)
return t;
if (++cnt < k)
return KthNode(pRoot.right, k);
else if (cnt == k)
return pRoot;
return null;
}