【Golang】LeetCode-剑指Offer-面试题54-二叉搜索树的第k大节点【解法与优化】

题目

在这里插入图片描述

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof


解题思路

二叉搜索树(Binary Search Tree),(又:二叉查找树,二叉排序树)

  • 它或者是一棵空树,或者是具有下列性质的二叉树:
    • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
    • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
    • 它的左、右子树也分别为二叉搜索树。

中序遍历(LDR)

  • 是二叉树遍历的一种,也叫做中根遍历、中序周游。
  • 在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树

代码

  • 中序遍历二叉搜索树,遍历的同时,把遍历到的节点数值存到一个可变切片里
  • 中序遍历的顺序为左中右,即得到的是一个递增序列
  • 逆中序遍历的顺序为右中左,即得到的是一个递减序列
  • 使用逆中序遍历在返回数组中的第 K-1 个即可得到结果

–执行用时:16 ms --内存消耗:6.3 MB

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func kthLargest(root *TreeNode, k int) int {
    var nums []int
    nums=getNums(&nums,root)
    return nums[k-1]
}

//逆中序遍历(右中左 -- 递减序列)
func getNums(nums *[]int,r *TreeNode) []int{
    if r.Right!=nil{
        getNums(nums,r.Right)
    }
    if r!=nil{
        *nums=append(*nums,r.Val)
    }
    if r.Left!=nil{
        getNums(nums,r.Left)
    }
    return *nums
}

优化:遍历到第K大则停止遍历

–执行用时:8 ms --内存消耗:5.9 MB

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
var count int

func kthLargest(root *TreeNode, k int) int {
    count=0
    var nums []int
    nums=getNums(&nums,root,k)
    return nums[k-1]
}

//逆中序遍历(右中左 -- 递减序列)
func getNums(nums *[]int,r *TreeNode,k int) []int{
    if r.Right!=nil{
        getNums(nums,r.Right,k)
    }
    if count<k && r!=nil{
        *nums=append(*nums,r.Val)
        count++
    }
    if r.Left!=nil{
        getNums(nums,r.Left,k)
    }
    return *nums
}

在LeetCode该题中,我也有提交题解,欢迎查看。昵称:Sakura。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值