求:
给定一棵二叉搜索树,请找出其中第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 ≤ 二叉搜索树元素个数
解:
思路:首先观察到题设条件,1 ≤ k ≤ 二叉搜索树元素个数,这意味着一定可以找到对应的节点,不会出现要找的节点不在树中的情况,也就不需要对这种情况进行特殊处理。同时,根据二叉搜索树的特点,我们进行反序中序遍历时(先遍历右子树,再遍历根节点,最后遍历左子树),得到的节点值是单调递减的。因此当我们执行了k次遍历操作后,找到的节点就是第k大的节点,将该节点的值记录下来,并在主调函数中返回即可。
 
  /** 
 
 
  
   * Definition for a binary tree node. 
 
 
  
   * struct TreeNode { 
 
 
  
   *     int val; 
 
 
  
   *     struct TreeNode *left; 
 
 
  
   *     struct TreeNode *right; 
 
 
  
   * }; 
 
 
  
   */ 
 
   
  
  void 
   Traverse( 
  struct 
   TreeNode* root,  
  int 
  * curr, 
  int 
   *ret){ 
 
 
  
       
  if 
  (root==NULL)   
  return 
  ; 
 
 
  
      Traverse(root->right,curr,ret); 
 
 
  
         
    if 
    (--*curr ==  
    0 
    ){ 
   
 
    
            *ret = root->val; 
   
 
    
             
    return 
    ; 
   
 
    
        } 
   
 
   
      Traverse(root->left,curr,ret); 
 
 
  
  } 
 
   
  
  int 
   kthLargest( 
  struct 
   TreeNode* root,  
  int 
   k){ 
 
 
  
       
  if 
  (root==NULL)   
  return 
    
  0 
  ; 
 
 
  
       
  int 
   ret; 
 
 
  
      Traverse(root,&k,&ret); 
 
 
  
       
  return 
   ret; 
 
 
  
  } 
 
 
来源:oschina
链接:https://my.oschina.net/u/4469818/blog/4286673