剑指 Offer 54. ! 二叉搜索树的第k大节点 (考察二叉树的中序遍历)

剑指 Offer 54. 二叉搜索树的第k大节点
给定一棵二叉搜索树,请找出其中第 k 大的节点的值。

剑指 Offer 54. ! 二叉搜索树的第k大节点 (考察二叉树的中序遍历)_第1张图片
我的思路是:用一个全局arrayList不断收集“逆向”中序遍历该搜索二叉树所需要的答案

class Solution {
    int res, k;
    public int kthLargest(TreeNode root, int k) {
        this.k = k; // !! 注意这里this的使用
        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/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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    ArrayList<Integer> list = new ArrayList<>();
    public int kthLargest(TreeNode root, int k) {
        preOrder(root);
        return list.get(k-1);
    }
    public void preOrder(TreeNode root){
        if(root!=null){
            preOrder(root.right);           
            list.add(root.val);
             preOrder(root.left);
        }
    }
}

下面是大佬K神的思路:
使用全局变量,一遍遍历一遍数,数到第k个最大的数时就返回。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    int res=0,kk=0;
    public int kthLargest(TreeNode root, int k) {
        kk=k;
        inverseInOrder(root);
        return res;
    }
    public void inverseInOrder(TreeNode root){
        if(root!=null){
            inverseInOrder(root.right);
            if(kk==0) return;
            if(kk-1==0) res=root.val;
            kk--;
            inverseInOrder(root.left);
        }

    }
}

你可能感兴趣的:(数据结构与算法,数据结构)