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

思路:

二叉搜索树的中序遍历是递增的!(左、根、右)

可以利用这个特性,进行中序遍历逆序的遍历(右、根、左)

 

代码:

class Solution {
	int res=-1,k;
    public int kthLargest(TreeNode root, int k) {
		this.k=k;
		dfs(root);
		return res;
	}
	
	private void dfs(
		TreeNode root
	){
		if(root==null){
			return;
		}
		
		//中序遍历倒序:右、根、左
		dfs(root.right);
		if(k==0){
			return;
		}
		
		if(--k==0){
			res=root.val;
		}
		
		dfs(root.left);
	}
}

 

分解:

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

可以利用这个特性,进行中序遍历逆序的遍历(右、根、左)

这样就可以得到降序的值

 

2)k和res都可以设置为全局变量

k要在全局做自减,res也是在全局只得到一个答案即可

 

复杂度分析:

时间复杂度:O(N) 最差情况下都退化为右倾的二叉树,此时无论k为何树,都要递归到深度为N的地方得到第一个右节点

空间复杂度:O(N) 最差情况下退化为右倾的二叉树,存储N个元素

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值