题解 | #二叉搜索树的第k个节点#
二叉搜索树的第k个节点
https://www.nowcoder.com/practice/57aa0bab91884a10b5136ca2c087f8ff
/* * function TreeNode(x) { * this.val = x; * this.left = null; * this.right = null; * } */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param proot TreeNode类 * @param k int整型 * @return int整型 */ function KthNode( proot , k ) { if(proot == null || k == 0) return -1; // 中序遍历 const list = traverse(proot); return k > list.length ? -1 : list[k - 1].val; } function traverse(node, list = []) { if(!node) return; traverse(node.left, list); list.push(node); traverse(node.right, list); return list; } module.exports = { KthNode : KthNode };
思路:
按照题意,先将树按 中序遍历 出来,从中序数组中找到第 K
个元素。
这种方案需要额外提供个数组,不太好。
可以利用一个 count 哨兵,计数当前遍历的第几个元素
function KthNode( proot , k ) { // 哨兵 res存储找到的元素 let count = 0, res; const midOrder = (node, k) => { if(!node || count > k) return; midOrder(node.left, k); // 中序遍历找到第 k 个元素 count++; if(count == k) { res = node.val; } midOrder(node.right, k); } midOrder(proot, k); if(!res) return -1; return res; }