一、题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
二、思路分析及代码实现
题目给定的为二叉搜索树,所以其中序遍历是按照从小到大的顺序排列的,我们只要找到第K个节点即可
import java.util.ArrayList;
public class Solution {
ArrayList<TreeNode> list=new ArrayList<>();
TreeNode KthNode(TreeNode pRoot, int k)
{
inorder(pRoot);
if(k>0&&k<=list.size()){
return list.get(k-1);
}
return null;
}
public void inorder(TreeNode node){
if(node!=null){
inorder(node.left);
list.add(node);
inorder(node.right);
}
}
}
代码优化,不必对整个数进行中序遍历,只遍历前K个元素
public class Solution {
TreeNode nodes=null;
int count=0;
TreeNode KthNode(TreeNode pRoot, int k)
{
if(k<=0||pRoot==null)
return null;
inorder(pRoot,k);
return nodes;
}
public void inorder(TreeNode node, int k){
if(count<k&&node.left!=null){
inorder(node.left,k);
}
//如果当前节点为第K个节点,则直接返回
if(++count==k)
nodes=node;
if(count<k&&node.right!=null){
inorder(node.right,k);
}
}
}