给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
方法一(递归):因为二叉搜索树中序遍历后是已经排序好的,所以使用中序遍历
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
private TreeNode target=null;
private int index;
TreeNode KthNode(TreeNode pRoot, int k)
{
index=k;
In(pRoot);
return target;
}
public void In(TreeNode node){
if(node==null || index<=0){
return;
}
In(node.left);
index--;
if(index==0){
target=node;
return;
}
In(node.right);
}
}
方法二:非递归
import java.util.Stack;
/*
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 || k<-0){
return null;
}
Stack<TreeNode> stack=new Stack<>();
TreeNode cur=pRoot;
while(!stack.isEmpty() || cur!=null){
if(cur!=null){
stack.push(cur);
cur=cur.left;
}else{
cur=stack.pop();
if(--k==0){
return cur;
}
cur=cur.right;
}
}
return null;
}
}