返回二叉搜索树的第k个节点
中序遍历是从小到大的,返回第k个就行
递归
写递归的时候,视角应该是在最上面的那个节点,然后想象遍历它的左子树怎么样,如果在这个节点会怎么样,然后再遍历右子树,而不是以一个底层节点的视角来看。
class Solution {
int res=0;
int rank=0;
public int kthSmallest(TreeNode root, int k) {
dfs(root,k);
return res;
}
public void dfs(TreeNode root,int k){
if(root==null)return;
dfs(root.left,k);
rank++;
if(rank==k){
res=root.val;
return;
}
dfs(root.right,k);
}
}
非递归
非递归就比较好写了,就是处理每个遍历到的节点。
import java.util.Stack;
public class Solution {
TreeNode KthNode(TreeNode pRoot, int k)
{
if(pRoot==null || k==0){
return null;
}
Stack<TreeNode> s=new Stack<TreeNode>();
int seq=0;
while(pRoot!=null || !s.isEmpty()){
if(pRoot!=null){
s.push(pRoot);
pRoot=pRoot.left;
} else{
pRoot=s.pop();
seq++;
if(seq==k){
return pRoot;
}
pRoot=pRoot.right;
}
}
return pRoot;
}
}