剑指 Offer 54. 二叉搜索树的第k大节点-中序遍历
Posted hequnwang10
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 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
二、解题
中序遍历
二叉搜索树想到中序遍历,中序遍历就是升序,中序遍历左 - 中 - 右,但是这题需要访问第K大的数字,所以需要改变一下中序遍历的顺序:右-中-左
class Solution
public int calculate(String s)
//使用栈 这里主要是处理 * 和 / ,+ 就是将值压栈 - 就是将负值压栈,遇到 * 将两个元素相乘然后压栈,遇到 / 将两个元素相除压栈
//这个栈就是存数,一个一个的数
Deque<Integer> stack = new LinkedList<>();
int curnum = 0;
char presign = '+';
char[] schar = s.toCharArray();
int length = s.length();
for(int i = 0;i<length;i++)
//取值
if(Character.isDigit(schar[i]))
curnum = curnum * 10 + schar[i] - '0';
//如果是运算符
if(!Character.isDigit(schar[i]) && schar[i] != ' ' || i == length - 1)
switch (presign)
case '+' :
stack.push(curnum);
break;
case '-' :
stack.push(-curnum);
break;
case '*' :
stack.push(stack.pop() * curnum);
break;
case '/' :
stack.push(stack.pop() / curnum);
break;
default :
presign = schar[i];
curnum = 0;
//取栈中的元素
int res = 0;
while(!stack.isEmpty())
res += stack.pop();
return res;
时间复杂度:O(n);
空间复杂度:O(n)。
创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖以上是关于剑指 Offer 54. 二叉搜索树的第k大节点-中序遍历的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode Java刷题笔记—剑指 Offer 54. 二叉搜索树的第k大节点