题目:给定一棵二叉搜索树,请找出其中的第k小的TreeNode结点。
* 示例1
* 输入{5,3,7,2,4,6,8},3
* 返回值{4}
* <p>
* 说明
* 按结点数值大小顺序第三小结点的值为4
声明TreeNode节点:
public class TreeNode {
public int value;
public TreeNode left;
public TreeNode right;
public TreeNode(int value) {
this.value = value;
}
}
求第k小TreeNode节点
/**
* https://blog.nowcoder.net/n/fa683a00f1a8445cad7c09f91b538265?f=comment
*/
public class The_K_st_TreeNode {
//方法一:
ArrayList<TreeNode> list = new ArrayList<>();
/**
* 递归中序遍历
*
* @param pRoot
* @param k
* @return
*/
TreeNode KthNode(TreeNode pRoot, int k) {
if (k == 0) return null;
inOrderTree(pRoot);
if (list.size() < k) return null;
return list.get(k - 1);
}
public void inOrderTree(TreeNode pRoot) {
if (pRoot != null) {
inOrderTree(pRoot.left);
list.add(pRoot);
inOrderTree(pRoot.right);
}
}
//方法二:
TreeNode KthNode1(TreeNode pRoot, int k) {
if (pRoot == null || k <= 0) {
return null;
}
Stack<TreeNode> stack = new Stack<>();
while (!stack.isEmpty() || pRoot != null) {
while (pRoot != null) {
stack.push(pRoot);
pRoot = pRoot.left;
}
//从栈中取出节点 并赋值给pRoot
pRoot = stack.pop();
if (--k == 0) {
return pRoot;
}
pRoot = pRoot.right;
}
return null;
}
}