算法—leetcode—offer—54

237 阅读1分钟

题目

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

限制

1 ≤ k ≤ 二叉搜索树元素个数

思路

二叉搜索树中序遍历是递增的顺序

方案一

1.将二叉搜索树的值经过中序遍历保存到数组中
2.保存到数组中的值是递增的,通过索引获取制定值

代码

// kthLargest
// @desc 剑指 Offer 54. 二叉搜索树的第k大节点
func kthLargest(root *TreeNode, k int) int {
	data := []int{}
	var inorder func(root *TreeNode)
	inorder = func(root *TreeNode){
		if root == nil{
			return
		}
		inorder(root.Left)
		data = append(data, root.Val)
		inorder(root.Right)
	}
	
	inorder(root)
	return data[len(data)-k]
}

方案二

1.中序遍历倒序方式即是递减的序列,直接递归k次即可

原理

中序遍历:左中右
中序遍历的倒序:右中左

代码

// kthLargest
// @desc 剑指 Offer 54. 二叉搜索树的第k大节点
func kthLargest(root *TreeNode, k int) int {
	var rs int
	var inorder func(root *TreeNode)
	inorder = func(root *TreeNode){
		if root == nil{
			return
		}
		inorder(root.Right)
		k--
		if k==0 {
			rs = root.Val
			return
		}
		inorder(root.Left)
	}
	
	inorder(root)
	return rs
}

参考

来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/er…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。