zoukankan      html  css  js  c++  java
  • 剑指offer54

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
     /*bst比较经典的题目 先要统计每个节点的字节点的个数 然后递归顺序查找即可*/
     /*耽误很长时间的坑是 不要忘记预处理计算和顺序查找时 当前节点+1 非常容易出错*/
    class Solution {
    public:
        int son_count(unordered_map<TreeNode * , int>  &son_num , TreeNode * root){
            
            if(root -> right == NULL && root -> left == NULL){
                 son_num.insert(pair<TreeNode * , int>(root , 0));
                 return 0;
            }
            else if(root -> right == NULL){
                 int L =  son_count(son_num , root -> left);
                 son_num.insert(pair<TreeNode * , int>(root , L+1));
                 return L + 1;
            }
            else if(root -> left == NULL){
                 int R = son_count(son_num , root -> right);
                 son_num.insert(pair<TreeNode * , int>(root , R+1));
                 return R + 1;
            }
            else{
                int L = son_count(son_num , root -> left);
                int R = son_count(son_num , root -> right);
                son_num.insert(pair<TreeNode * , int>(root , L+R+2));
                return L + R + 2;
            }
        }
    
        int findKth(unordered_map<TreeNode * , int>  &son_num , TreeNode * root ,int k){
             int left_num = 0;
             int right_num = 0;
    
             if(root -> left != NULL) left_num = son_num[root -> left] + 1;
             
             
             int ans = 0;
             if(k == left_num + 1)
                 ans =  root -> val;
             else if(k < left_num + 1)
                 ans = findKth(son_num , root->left , k);
             else /*k > left_num + 1*/
                 ans = findKth(son_num , root-> right , k - left_num - 1);
    
            return ans;
             
        }
        int kthLargest(TreeNode* root, int k) {
               unordered_map<TreeNode * , int> son_num;
               int cnt  = son_count(son_num , root) + 1;
               //printf("%d 
    " , cnt);
               k = cnt - k + 1;
               //printf("%d 
    " , k);
               int ans = findKth(son_num , root , k);
               return ans;
               
        }
    };
  • 相关阅读:
    PlantUML —— 应用于 Eclipse 的简单快速的 UML 编辑软件
    PlantUML类图
    Java 基于log4j的日志工具类
    RabbitMQ Hello world(二)
    redis lua 初体验
    mysql 批处理 innodb_flush_at_trx_commit 测试分析
    mysql 服务日志 5.7.29
    redis 浅谈事务
    redis list 基本操作
    redis hash 基本操作
  • 原文地址:https://www.cnblogs.com/rhythmic/p/13992817.html
Copyright © 2011-2022 走看看