一、问题描述
给定一棵二叉搜索树,请找出其中第k大的节点。
二、解题思路
1.二叉树的中序遍历 为 “左、根、右” 顺序,递归法代码如下:
// 打印中序遍历
void dfs(TreeNode root) {
if(root == null) return;
dfs(root.left); // 左
System.out.println(root.val); // 根
dfs(root.right); // 右
}
如果我们中序遍历搜索二叉树,将得到一个从小到大的序列。在这里,我们把遍历得到的各个节点的值保存在一个栈中。接下来我们再把栈按照顺序弹出k-1个元素,最后栈顶元素即为二叉树的第k大节点。
三、代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
Stack<Integer> stack = new Stack<>();
public int kthLargest(TreeNode root, int k) {
dfs(root);
for(int i = 0;i<k-1;i++){
stack.pop();
}
return stack.peek();
}
private void dfs(TreeNode root){
if(root==null){
return;
}
dfs(root.left);
stack.push(root.val);
dfs(root.right);
}
}