leetcode面试题54(二叉搜索树的第k大节点)--C语言实现

≯℡__Kan透↙ 提交于 2020-10-25 05:21:42

求:

给定一棵二叉搜索树,请找出其中第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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!