From cfc666eda686e63b217650f09bbaa1a1ed7130ed Mon Sep 17 00:00:00 2001 From: YangFong <70502828+YangFong@users.noreply.github.com> Date: Tue, 15 Feb 2022 17:32:33 +0800 Subject: [PATCH] docs: add a description of the solution to lcof problem: No.54 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 面试题54. 二叉搜索树的第k大节点 --- .../README.md" | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git "a/lcof/\351\235\242\350\257\225\351\242\23054. \344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\347\254\254k\345\244\247\350\212\202\347\202\271/README.md" "b/lcof/\351\235\242\350\257\225\351\242\23054. \344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\347\254\254k\345\244\247\350\212\202\347\202\271/README.md" index 1b0918aaf5a72..5157ca6d1076f 100644 --- "a/lcof/\351\235\242\350\257\225\351\242\23054. \344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\347\254\254k\345\244\247\350\212\202\347\202\271/README.md" +++ "b/lcof/\351\235\242\350\257\225\351\242\23054. \344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\347\254\254k\345\244\247\350\212\202\347\202\271/README.md" @@ -40,7 +40,36 @@ ## 解法 -先遍历右子树,访问根节点,再遍历左子树。遍历到第 k 个结点时,存储结果。 +朴素解法: + +1. 中序遍历,并使用数组存储遍历结果。 +2. 遍历结束,返回 `arr[arr.length - k]`。 + +*优化*: + +其中,只关注**第 k 大节点的值**,可以选择倒序遍历,记录当前遍历节点的数量,当数量为 `k` 时,记录当前节点值做为返回值即可,而无需记录所有的遍历结果。 + +> 中序遍历的顺序是从小到大,倒序的中序遍历便是从大到小。 + +常规中序遍历: + +```txt +IN-ORDER(R) + IN-ORDER(R.left) + print(R.val) + In-ORDER(R.right) +``` + +倒序中序遍历: + +```txt +IN-ORDER-REVERSE(R) + In-ORDER-REVERSE(R.right) + print(R.val) + IN-ORDER-REVERSE(R.left) +``` + +若是抬杠说,可能每次 `k` 都是节点数量,那么倒序就毫无意义并且加长时间消耗。这些情况是无法假设的,如果 `k = 1`,那又该怎么说,选择倒序先得最大值,才是符合题意的精神。