剑指offer中:给定一棵二叉搜索树,请找出其中的第k小的结点。(java)版
1、题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7, 2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
2、思路
(1)因为是二叉排序树,故可以用中序遍历得到的数据存储在集合中,然后直接取出第几个数即可。
(2)分别递归查找左右子树的第K个节点,或使用非递归借用栈的方式查找,当count=k时返回根节点。
3、源代码
public class Solution {
TreeNode KthNode(TreeNode pRoot, int k)
{
if(pRoot == null)
return pRoot;
ArrayList L1 = new ArrayList<>();
sort(pRoot,L1);
if(k == 0 || k > L1.size())
return null;
return L1.remove(k-1);
}
public static void sort(TreeNode pRoot,ArrayList L1){
if(pRoot == null)
return ;
sort(pRoot.left,L1);
L1.add(pRoot);
sort(pRoot.right,L1);
}
}
(2)
public class Solution {
int count = 0;
TreeNode KthNode(TreeNode pRoot, int k)
{
if(pRoot == null || k < 1)
return null;
count++;
if(count == k){
return pRoot;
}
TreeNode leftNode = KthNode(pRoot.left,k);
if(leftNode != null)
return leftNode;
TreeNode rightNode = KthNode(pRoot.right,k);
if(rightNode != null)
return rightNode;
return null;
}
}