int kthSmallest(TreeNode* root, int k) {
vector<int> values;
function<void(TreeNode*)> inorder = [&](TreeNode* node) {
if (!node) return;
inorder(node->left);
values.push_back(node->val);
inorder(node->right);
};
inorder(root);
return values[k - 1];
}
public int kthSmallest(TreeNode root, int k) {
List<Integer> values = new ArrayList<>();
inorder(root, values);
return values.get(k - 1);
}
private void inorder(TreeNode node, List<Integer> values) {
if (node == null) return;
inorder(node.left, values);
values.add(node.val);
inorder(node.right, values);
}
def kth_smallest(root, k):
values = []
def inorder(node):
if not node: return
inorder(node.left)
values.append(node.val)
inorder(node.right)
inorder(root)
return values[k - 1]
function kthSmallest(root: TreeNode | null, k: number): number {
const values: number[] = [];
const inorder = (node: TreeNode | null): void => {
if (!node) return;
inorder(node.left);
values.push(node.val);
inorder(node.right);
};
inorder(root);
return values[k - 1];
}
int kthSmallest(TreeNode* root, int k) {
int count = 0;
int answer = 0;
function<void(TreeNode*)> inorder = [&](TreeNode* node) {
if (!node || count >= k) return;
inorder(node->left);
count++;
if (count == k) answer = node->val;
inorder(node->right);
};
inorder(root);
return answer;
}
public int kthSmallest(TreeNode root, int k) {
int[] state = {0, 0};
inorder(root, k, state);
return state[1];
}
private void inorder(TreeNode node, int k, int[] state) {
if (node == null || state[0] >= k) return;
inorder(node.left, k, state);
state[0]++;
if (state[0] == k) state[1] = node.val;
inorder(node.right, k, state);
}
def kth_smallest(root, k):
count = 0
answer = 0
def inorder(node):
nonlocal count, answer
if not node or count >= k: return
inorder(node.left)
count += 1
if count == k: answer = node.val
inorder(node.right)
inorder(root)
return answer
function kthSmallest(root: TreeNode | null, k: number): number {
let count = 0;
let answer = 0;
const inorder = (node: TreeNode | null): void => {
if (!node || count >= k) return;
inorder(node.left);
count++;
if (count === k) answer = node.val;
inorder(node.right);
};
inorder(root);
return answer;
}
int kthSmallest(TreeNode* root, int k) {
vector<TreeNode*> stack;
TreeNode* node = root;
while (node || !stack.empty()) {
while (node) {
stack.push_back(node);
node = node->left;
}
node = stack.back(); stack.pop_back();
k--;
if (k == 0) return node->val;
node = node->right;
}
return -1;
}
public int kthSmallest(TreeNode root, int k) {
Deque<TreeNode> stack = new ArrayDeque<>();
TreeNode node = root;
while (node != null || !stack.isEmpty()) {
while (node != null) {
stack.push(node);
node = node.left;
}
node = stack.pop();
k--;
if (k == 0) return node.val;
node = node.right;
}
return -1;
}
def kth_smallest(root, k):
stack = []
node = root
while node or stack:
while node:
stack.append(node)
node = node.left
node = stack.pop()
k -= 1
if k == 0: return node.val
node = node.right
return -1
function kthSmallest(root: TreeNode | null, k: number): number {
const stack: TreeNode[] = [];
let node = root;
while (node || stack.length > 0) {
while (node) {
stack.push(node);
node = node.left;
}
node = stack.pop()!;
k--;
if (k === 0) return node.val;
node = node.right;
}
return -1;
}
int kthSmallest(TreeNode* root, int k) {
int count = 0;
int answer = -1;
TreeNode* cur = root;
while (cur) {
if (!cur->left) {
count++; if (count == k) answer = cur->val;
cur = cur->right;
} else {
TreeNode* pred = cur->left;
while (pred->right && pred->right != cur) pred = pred->right;
if (!pred->right) {
pred->right = cur;
cur = cur->left;
} else {
pred->right = nullptr;
count++; if (count == k) answer = cur->val;
cur = cur->right;
}
}
}
return answer;
}
public int kthSmallest(TreeNode root, int k) {
int count = 0;
int answer = -1;
TreeNode cur = root;
while (cur != null) {
if (cur.left == null) {
count++; if (count == k) answer = cur.val;
cur = cur.right;
} else {
TreeNode pred = cur.left;
while (pred.right != null && pred.right != cur) pred = pred.right;
if (pred.right == null) {
pred.right = cur;
cur = cur.left;
} else {
pred.right = null;
count++; if (count == k) answer = cur.val;
cur = cur.right;
}
}
}
return answer;
}
def kth_smallest(root, k):
count = 0
answer = -1
cur = root
while cur:
if not cur.left:
count += 1
if count == k: answer = cur.val
cur = cur.right
else:
pred = cur.left
while pred.right and pred.right is not cur: pred = pred.right
if not pred.right:
pred.right = cur
cur = cur.left
else:
pred.right = None
count += 1
if count == k: answer = cur.val
cur = cur.right
return answer
function kthSmallest(root: TreeNode | null, k: number): number {
let count = 0;
let answer = -1;
let cur = root;
while (cur) {
if (!cur.left) {
count++; if (count === k) answer = cur.val;
cur = cur.right;
} else {
let pred = cur.left;
while (pred.right && pred.right !== cur) pred = pred.right;
if (!pred.right) {
pred.right = cur;
cur = cur.left;
} else {
pred.right = null;
count++; if (count === k) answer = cur.val;
cur = cur.right;
}
}
}
return answer;
}