剑指 Offer 54. 二叉搜索树的第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 ≤ 二叉搜索树元素个数
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof
代码实现
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int kthLargest(TreeNode* root, int k) {
        TreeNode* p = root;
        stack<TreeNode*> node_stack;
        while(p != NULL || !node_stack.empty()) {
            while(p != NULL) {
                node_stack.push(p);
                p = p->right;
            }
            if(!node_stack.empty()) {
                TreeNode* t = node_stack.top();
                p = t->left;
                node_stack.pop();
                k--;
                if(k == 0)  return t->val;
            }
        }
        return NULL;
    }
};
思路解析
- 常用的中序遍历二叉搜索树(左子树->根节点->右子树),可从小到大输出元素。
- 逆序中序遍历二叉搜索树(右子树->根节点->左子树),当输出第k个元素时直接返回。
- 使用循环中序遍历二叉搜索树。

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号