中序遍历也就是搜索二叉树的排序
#剑指offer NO62 二叉搜索树的第K小的值
##1.用栈实现中序遍历
package NO62二叉搜索树的第k个结点____实现中序遍历;
import NO4重建二叉树_______.TreeNode;
import java.util.Stack;
public TreeNode findKthNode(TreeNode root,int k) //NO62.二叉搜索树的第K小的值
{
int count = 0;
Stack<TreeNode> stack = new Stack<>();
TreeNode node = root;
while (node != null || !stack.isEmpty()) //只有栈和 结点都为空,才为空。
{
while (node != null)
{
stack.push(node);
node = node.left;
}
node = stack.pop(); //如果node为null,那么就得从栈中出栈一个,node不为空,就入栈。
if ( ++count == k)
return node;
node = node.right; //node不符合条件的话,就看右子树,右子树的值是比node大的。
//右子树的也会去入栈。这样的话就是中序遍历的顺序。
}
return null;
}
##2.利用递归来实现中序遍历
private TreeNode ret;
private int cnt = 0;
public TreeNode KthNode(TreeNode pRoot, int k)
{
inOrder(pRoot, k);
return ret;
}
private void inOrder(TreeNode root, int k)
{
if (root == null || cnt >= k) // 递归出口
return;
inOrder(root.left, k);
cnt++;
if (cnt == k)
ret = root;
inOrder(root.right, k);
}