/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } */ /** * @param {TreeNode} root * @param {number} k * @return {number} */ const kthSmallest = function (root, k) { }; /* 根据二叉搜索树的特性,直接对其进行中序遍历,遍历到的第k个数就是第k小,这里使用迭代的方式,好返回结果 */ function f1(root, k) { const stack = []; // 栈用于模拟中序遍历 let node = root; // 从根节点开始遍历 while (node || stack.length > 0) { // 先处理左子树,将所有左子树节点压入栈中 while (node) { stack.push(node); node = node.left; } // 弹出栈顶元素并访问 node = stack.pop(); // 递减k,如果k为0,说明我们已经找到了第k个最小值 if (--k === 0) { return node.val; } // 处理右子树 node = node.right; } return null; // 如果没有找到k个元素,返回null(一般不会发生) } /* 当一如果当前节点就是目标节点,那么它的左子树的数量一定是k-1个,如果左子树的数量小于k-1个那么目标节点一定存在右子树中, 以当前节点右子树为根节点继续寻找此时k要出去左子树的left加上自己一共left + 1个,所以以右子节点为更节点的子树只需寻找 第 k-(left+1)个大的数。使用面向对象的写法封装。 */ // TODO: