二叉搜索树的第k大结点
给定一棵二叉搜索树,请找出其中第k大的节点。
做法:二叉搜索树的中序遍历是递增序列,中序遍历之后返回第k大的元素即可
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int kthLargest(TreeNode root, int k) {
//中序遍历,将结点的值添加进ArrayList,返回第k个元素即可
ArrayList<Integer> list = new ArrayList<Integer>();
inOrder(root,list);
return list.get(list.size() - k);
}
public void inOrder(TreeNode root,ArrayList<Integer> list){
if(root == null){
return;
}
inOrder(root.left,list);
list.add(root.val);
inOrder(root.right,list);
}
}
大佬做法:用变量k记录当前访问的是第几个结点,采用中序遍历的逆序输出,这样就避免了后续无效的遍历
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);
}
}
作者:jyd
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/solution/mian-shi-ti-54-er-cha-sou-suo-shu-de-di-k-da-jie-d/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。