剑指Offer 54. 二叉搜索树的第k大结点

剑指Offer 54. 二叉搜索树的第k大结点

  • 题目描述
  • 题解
    • 两次中序遍历法
  • 运行结果

题目描述

给定一棵二叉搜索树,请找出其中第k大的节点。

示例 1:
输入: root = [3,1,4,null,2], k = 1
   3
  / \
 1   4
  \
   2
输出: 4

题解

两次中序遍历法

二叉排序树的中序遍历得到的是一个升序序列,第k大即倒数第k个元素,所以只需要通过中序遍历将元素读到数组中即可,数组分配的空间可以直接用MAXSIZE,也可以通过一次附加的中序遍历获取长度,用时间换空间,算法的空间复杂度取决于递归深度,平均情况下为O(log2n),时间复杂度与中序遍历一致,为O(n)。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

void inOrderLen(struct TreeNode* root, int* length) {
     
    if (root != NULL) {
     
        inOrderLen(root->left, length);
        (*length) ++;
        inOrderLen(root->right, length);
    }
}

void inOrderAns(struct TreeNode* root, int* ans, int* length) {
     
    if (root != NULL) {
     
        inOrderAns(root->left, ans, length);
        ans[(*length) ++] = root->val;
        inOrderAns(root->right, ans, length);
    }
}

int kthLargest(struct TreeNode* root, int k) {
     
    int length = 0;
    inOrderLen(root, &length);
    int* ans = (int*)malloc(sizeof(int) * length);
    length = 0;
    inOrderAns(root, ans, &length);
    return ans[length-k];
}

运行结果

剑指Offer 54. 二叉搜索树的第k大结点_第1张图片

你可能感兴趣的:(LeetCode刷题总结,数据结构,leetcode)