#
Given a binary search tree, write a function `kthSmallest`

to find the kth smallest element in it.

Example 1:

Input: root = [3,1,4,null,2], k = 1

3

/ \

1 4

\

2

Answer is 1 because the 1st smallest element when binary tree is sorted is 1

Example 2:

Input: root = [5,3,6,2,4,null,null,1], k = 3

```
5
/ \
3 6
/ \
```

2 4

/

1

Answer is 3, as 1 and 2 are 1st and 2nd smallest elements in the tree and the next is 3 which is 3rd smallest element

A simple approach would be traversing the whole tree using inorder traveral and push the elements to a stack.

Now the stack will be in ascending order. All you need is stack's *k-1* th element

Here's the code

```
/**
* @param {TreeNode} root
* @param {number} k
* @return {number}
*/
var kthSmallest = function(root, k) {
let inorder = (node, arr) => {
if(!node) return arr
inorder(node.left, arr)
arr.push(node.val)
inorder(node.right, arr)
return arr
}
let sortedArr = inorder(root, [])
return sortedArr[k - 1]
};
```

The algorithm can be improved when k is considered and finding only k elements

Thee algorithm is

- initialize empty array
- loop through the root and push root to stack and change root to root.left
- Now we have all left nodes
- take the last node
- Decrement k by 1. if it's 0 return node value
- assign root = root.right

Here's the code for iteration:

```
/**
* @param {TreeNode} root
* @param {number} k
* @return {number}
*/
var kthSmallest = function(root, k) {
let stack = new Array()
while(true) {
while(root) {
stack.push(root)
root = root.left
}
root = stack.pop()
if(--k == 0) return root.val
root = root.right
}
}
```

## Discussion