剑指 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个元素时直接返回。
  • 使用循环中序遍历二叉搜索树。
posted @ 2020-09-08 15:55  行者橙子  阅读(121)  评论(0编辑  收藏  举报