Go&Java算法之二叉搜索树的第K大节点

228 阅读2分钟

这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

二叉搜索树的第K大节点

给定一棵二叉搜索树,请找出其中第k大的节点。

 

示例 1:

输入: root = [3,1,4,null,2], k = 1

3

/ \

1 4

\

2

输出: 4 示例 2:

输入: root = [5,3,6,2,4,null,null,1], k = 3

5

/ \

3 6

/ \

2 4

/

1

输出: 4  

限制:

1 ≤ k ≤ 二叉搜索树元素个数

题解

方法一:中序遍历——Java

中序遍历: 二叉搜索树中序遍历是从小到大。先遍历右子树,再遍历左子树,就变成从大到小了。

用target计数,target等于0时,就是我们要找的第K大节点

为求第 k 个节点,需要实现以下 三项工作 :

递归遍历时计数,统计当前节点的序号;

递归到第 k 个节点时,应记录结果 res ;

记录结果后,后续的遍历即失去意义,应提前终止(即返回)。

递归解析: 终止条件: 当节点 root 为空(越过叶节点),则直接返回;

递归右子树: 即 dfs(root.right) ;

三项工作:

提前返回: 若 k = 0 ,代表已找到目标节点,无需继续遍历,因此直接返回;

统计序号: 执行 k = k - 1 (即从 k 减至 0 );

记录结果: 若 k = 0 ,代表当前节点为第 k 大的节点,因此记录 res = root.val ;

递归左子树: 即 dfs(root.left);

class Solution {
    private int kthLargestK = 0;
    private int kthLargestRes = 0;

    public int kthLargest(TreeNode root, int k) {
        if (root == null || k <= 0) {
            return -1;
        }
        this.kthLargestK = k;
        kthLargestHelper(root);
        return kthLargestRes;
    }

    public void kthLargestHelper(TreeNode root) {
        if (root == null) {
            return;
        }

        kthLargestHelper(root.right);
        if (--kthLargestK == 0) {
            kthLargestRes = root.val;
            return;
        }
        kthLargestHelper(root.left);
    }
}

时间复杂度:O(N)

空间复杂度:O(N)

方法一:中序遍历——Go

func kthLargest(root *TreeNode, k int)(res int ){
     var recur func(root*TreeNode)
     recur=func(root*TreeNode){
     if root==nil||k<=0{
         return
     }
     recur(root.Right)
     k--
     if k==0{
         res=root.Val
         return 
     }
     recur(root.Left)
     }
       recur(root)
       return  
}