剑指Offer-二叉搜索树的第k个结点
题目描述#
给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
思路#
利用二叉搜索数中序遍历有序的特点。
用递归和迭代分别实现中序遍历。
代码实现#
package Tree;
import java.util.Stack;
/**
* 二叉搜索树的第k个结点
* 给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
* 思路:
* 利用二叉搜索数中序遍历有序的特点。
*/
public class Solution49 {
private int cnt;
private TreeNode res;
/**
* 迭代中序遍历
*
* @param pRoot
* @param k
* @return
*/
TreeNode KthNode_2(TreeNode pRoot, int k) {
if (pRoot == null || k == 0)
return null;
int cnt = 0;
Stack<TreeNode> stack = new Stack<>();
while (pRoot != null || !stack.isEmpty()) {
while (pRoot != null) {
stack.push(pRoot);
pRoot = pRoot.left;
}
pRoot = stack.pop();
cnt++;
if (cnt == k) return pRoot;
pRoot = pRoot.right;
}
return null;
}
TreeNode KthNode(TreeNode pRoot, int k) {
inOrder(pRoot, k);
return res;
}
/**
* 递归中序遍历
*
* @param pRoot
* @param k
*/
void inOrder(TreeNode pRoot, int k) {
if (pRoot == null) return;
if (cnt > k) return;
inOrder(pRoot.left, k);
cnt++;
if (cnt == k) res = pRoot;
inOrder(pRoot.right, k);
}
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?