首页 > 其他分享 >剑指 Offer 54. 二叉搜索树的第k大节点

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

时间:2023-08-19 11:44:05浏览次数:41  
标签:tmp return Offer int 54 dfs 二叉 TreeNode root

方法一:

由于是有序的平衡二叉树,因此是中序。根据dfs中序迭代求得递增排序后,再反转就可求得结果。

class Solution {
public:
    vector<int> tmp;
    int kthLargest(TreeNode* root, int k) {
        // if(root != NULL) return 
        dfs(root);
        reverse(tmp.begin(), tmp.end());
        return tmp[k -1];
    }
    void dfs(TreeNode* root) {
        if(root == NULL) return;
        dfs(root->left);
        tmp.emplace_back(root->val);
        dfs(root->right);
    }
};
时间28 ms 内存23.8 MB

方法二:

改进:直接将中序遍历改成右->根->左,这样既省去了开辟额外的数组,又省去了最后的reverse的O(n)算法复杂度。

注意:dfs迭代是,传递的k是引用!!

class Solution {
public:
    int res;
    int kthLargest(TreeNode* root, int k) {
        dfs(root, k);
        return res;
    }
    void dfs(TreeNode *root, int &k) {
        if(root == NULL || k <= 0) return;
        dfs(root->right, k);
        k --;
        if(k == 0) {
            res = root->val;
            return;
        }
        dfs(root->left, k);
    }
};
时间20 ms 内存23.4 MB

 

标签:tmp,return,Offer,int,54,dfs,二叉,TreeNode,root
From: https://www.cnblogs.com/luxiayuai/p/17642256.html

相关文章

  • 【LeetCode1454. 活跃用户】MySQL 用户自定义变量,面向过程编程解决"连续天数"的问题
    目录题目地址题目描述代码题目地址https://leetcode.cn/problems/active-users/description/题目描述活跃用户是指那些至少连续 5天登录账户的用户。编写解决方案, 找到活跃用户的id和name。返回的结果表按照id排序 。代码注意需要处理,同一天多次登录的情形......
  • 合并二叉树
    力扣(LeetCode)官网-全球极客挚爱的技术成长平台经验1:程序写在递归函数前面代表压栈的时候实现,也就是说浏览到这个结点的时候实现程序写在递归函数后面代表弹栈的时候实现,也就是下一次递归结束后在本次递归函数中实现那么到底是压栈的时候实现还是弹栈的时候实现呢,这要看对根......
  • 剑指 Offer 36. 二叉搜索树与双向链表
    本题比较重要的有两点:1.一般认为有序的二叉搜索树,都是中序遍历。2.中序遍历的递归顺序,得到的就是排好序的,就是链表的顺序,因此只需管遍历的过程中的链表指向即可。classSolution{public://pre将来指向尾节点,head指向头节点Node*pre=nullptr,*head=nullptr;......
  • 剑指 Offer 16. 数值的整数次方(中等)
    题目classSolution{public:doubletraversal(doublex,intn){if(n==0)return1.00000;doubley=traversal(x,n/2);//本题需要对递归时的指数进行二分法,否则超时。returnn%2==0?y*y:y*y*x;//y=(x^4)。n=8,则x^8=y*y;n......
  • 剑指 Offer 34. 二叉树中和为某一值的路径
    dfsclassSolution{public:vector<vector<int>>res;vector<int>tmp;voiddfs(TreeNode*node,inttarget){if(node==nullptr)return;target-=node->val;tmp.emplace_back(node->val);......
  • 二叉搜索树
    博客地址:https://www.cnblogs.com/zylyehuo/#-*-coding:utf-8-*-#构造二叉树classBiTreeNode:def__init__(self,data):self.data=dataself.lchild=None#左孩子self.rchild=None#右孩子self.parent=None......
  • 判断是否为完全二叉树
    利用层次遍历思想,但结点是否为空不影响入队。当出队时,该结点为空,若队列中仍有不为空的结点,则不是完全二叉树空树也是完全二叉树#include<stdio.h>#include<stdlib.h>#defineMaxSize100typedefstructNode{intdata;structNode*lchild,*rchild;}TreeNode......
  • 【剑指Offer】61、序列化二叉树
    【剑指Offer】61、序列化二叉树题目描述:请实现两个函数,分别用来序列化和反序列化二叉树。解题思路:序列化是指将结构化的对象转化为字节流以便在网络上传输或写到磁盘进行永久存储的过程。反序列化是指将字节流转回结构化的对象的过程,是序列化的逆过程。受第4题:重建二叉树的启......
  • 【剑指Offer】62、二叉搜索树的第k个结点
    【剑指Offer】62、二叉搜索树的第k个结点题目描述:给定一棵二叉搜索树,请找出其中的第k小的结点。例如(5,3,7,2,4,6,8)中,按结点数值大小顺序第三小结点的值为4。解题思路:本题实际上比较简单,主要还是考察对树的遍历的理解,只要熟练掌握了树的三种遍历方式及其特点,解决本题并不复杂,很明显......
  • 普通二叉搜索树剖析
    二叉搜索树概述二叉搜索树是一种具有特殊性质的二叉树。二叉搜索树可以是一棵空树,若不为空树,其:若左子树不为空,则左子树所有的节点值小于根节点值;若右子树不为空,则右子树所有的节点值大于根节点值。与二叉树一样,二叉搜索树也是递归定义的,二叉搜索树的左右子树都是二叉搜索树。二叉搜......