剑指offer第54题 二叉搜索树的第k大节点



问题描述:

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

示例 1:

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

示例 2:

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

限制:

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

解题思路:

  由于是二叉搜索树,所以中序遍历(左,中,右)的结果是递增的,但是题目求的是第K大的数;我们可以逆序遍历,即按照右,中,左的顺序进行遍历。
  需要注意设置全局变量对结果进行记录,以及当找到目标值时就不需要继续遍历了。

代码实现:

public class t54二叉搜索树的第k大节点 {
    
    
	
	private static int num;
	private static int k;       //由于遍历的过程中k的值不断变化,所以需要将k设置为全局变量
	
    public int kthLargest(TreeNode root, int k) {
    
    
    	this.k = k;
    	dfs(root);
    	return num;
    }

	private void dfs(TreeNode root) {
    
    
		if(root==null || k<0) return ;
		dfs(root.right);
		k--;
		if(k==0) {
    
    
			num = root.val;
			return ;
		}
		dfs(root.left);
	}
}

提交结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/HC199854/article/details/109350694