剑指 Offer.54-二叉搜索树的第k大节点
剑指 Offer.54-二叉搜索树的第k大节点
题目链接
<二叉搜索树的第k大节点>
问题描述
给定一棵二叉搜索树,请找出其中第 k
大的节点的值
个人想法
题目给出的数据结构为二叉搜索树,该数据结构的特性是,通过中序遍历,可得到该树的顺序输出,当将递归代码由左中右,改为右中左时,即可得到该树的逆序输出(在自己写的时候没有想到逆序输出!!)
解法1:使用额外空间记录二叉树的有序输出,直接返回对应的length-k
个元素即可
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Solution { List<Integer> list = new ArrayList<>(); public int kthLargest(TreeNode root, int k) { middleTraversal(root); return list.get(list.size()-k); }
void middleTraversal(TreeNode root){ if(root == null) return; middleTraversal(root.left); list.add(root.val); middleTraversal(root.right); } }
|
官方解法
使用中序遍历的变种方法,递归从右中左进行遍历,同时使用全局遍历记录当前递归的值,到达k
时,直接记录,返回
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { int res, k; public int kthLargest(TreeNode root, int k) { this.k = k; dfs(root); return res; } void dfs(TreeNode root) { if(root == null) return; dfs(root.right); if(k == 0) return; if(--k == 0) res = root.val; dfs(root.left); } }
|