思路1: 递归中序遍历,返回中序遍历中的第k个数。
思路2: 迭代方式实现的中序遍历,遍历到第k个数即返回。
思路3: 如果可以修改数结构,增加一个leftCount属性,记录当前节点左子树节点个数。
[ref]
http://bookshadow.com/weblog/2015/07/02/leetcode-kth-smallest-element-bst/
public class Solution { // Method 1 public int kthSmallest1(TreeNode root, int k) { ArrayList<Integer> list = new ArrayList<Integer>(); inorder(root, list); return list.get(k - 1); } public void inorder(TreeNode root, ArrayList<Integer> list) { if (root == null) return; inorder(root.left, list); list.add(root.val); inorder(root.right, list); } // Method 2 public int kthSmallest(TreeNode root, int k) { LinkedList<TreeNode> stack = new LinkedList<TreeNode>(); TreeNode curr = root; int n = 0; while (curr != null || !stack.isEmpty()) { if (curr != null) { stack.push(curr); curr = curr.left; } else { curr = stack.pop(); n++; if (n == k) return curr.val; // if (curr.right != null) // leads to timeout curr = curr.right; } } return 0; } // Method 3 public int kthSmallest(TreeNode root, int k) { while (root != null) { if (root.leftCount == k - 1) return root.val; else if (root.leftCount >= k) root = root.left; else { root = root.right; k -= root.leftCount + 1; } } return 0; } }