zoukankan      html  css  js  c++  java
  • 剑指Offer_#54_二叉搜索树的第k大节点

    剑指Offer_#54_二叉搜索树的第k大节点

    Contents

    题目

    给定一棵二叉搜索树,请找出其中第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 ≤ 二叉搜索树元素个数

    思路分析

    对于二叉搜索树中每个节点来说,左子树的所有节点小于当前节点,右子树的所有节点大于当前节点。由此很容易得出结论:二叉搜索树的后序遍历是有序的(从小到大)。
    本题要求的是二叉搜索树当中第k大的节点,我们可以对后序遍历做简单修改适应题目要求,即遍历顺序改为右-左-根,这样得到的序列是从大到小的,我们只需要返回这个序列里第k个数即可。
    以上的思路还有优化空间。因为题目只需要得到第k大的数字,不需要得到其他数字,所以没必要把所有数字都遍历,而是遇到第k大的数字,就可以结束。所以我们只需要用两个变量,res用于保存当前遍历到的数字,count做计数器,当count == k时,返回当前的数字res

    解答

    class Solution {
        int count = 0,res = 0;
        public int kthLargest(TreeNode root, int k) {
            recur(root,k);
            return res;
        }
        //右-根-左中序遍历,是从大到小的顺序
        private void recur(TreeNode root, int k){
            if(root != null){
                recur(root.right,k);
                count ++;
                if(count == k) res = root.val;
                recur(root.left,k);
            }
        }
    }
  • 相关阅读:
    第六周上机任务
    java第四次作业
    第二次上机练习
    第三周作业
    第一次上机作业
    计算机1802刘思源
    第五次上机作业
    第六周作业
    第四次上机作业
    第三次上机作业
  • 原文地址:https://www.cnblogs.com/Howfars/p/13355439.html
Copyright © 2011-2022 走看看