[剑指offer]面试题第[54]题[JAVA][二叉搜索树的第k大节点][递归][迭代]

【问题描述】[简单]

给定一棵二叉搜索树,请找出其中第k大的节点。示例 1:
输入: root = [3,1,4,null,2], k = 13/ \1   4\2
输出: 4
示例 2:输入: root = [5,3,6,2,4,null,null,1], k = 35/ \3   6/ \2   4/1
输出: 4

【解答思路】

反向中序遍历
遍历到第k个节点时,直接返回改节点值,如果未找到,则返回0
在这里插入图片描述

1. 递归

在这里插入图片描述
时间复杂度:O(N) 空间复杂度:O(1)

class Solution {int res, k;public int kthLargest(TreeNode root, int k) {this.k = k;dfs(root);return res;}void dfs(TreeNode root) {if(root == null) return;dfs(root.right);if(k == 0) return;if(--k == 0) res = root.val;dfs(root.left);}
}
nt count=0, res=0;//形参k不能随着dfs的迭代而不断变化,为了记录迭代进程和结果,引入类变量count和res。public int kthLargest(TreeNode root, int k) {this.count=k;//利用形参值k对类变量count进行初始化dfs(root);//这里不要引入形参k,dfs中直接使用的是初始值为k的类变量countreturn res;            }public void dfs(TreeNode root){if(root==null||count==0) return;//当root为空或者已经找到了res时,直接返回dfs(root.right);if(--count==0){//先--,再判断res = root.val;return;//这里的return可以避免之后的无效迭代dfs(root.left);}dfs(root.left);  }
2. 迭代

如下图(5,3,7,2,4,6,8) 中,按节点数值大小顺序第三小结点的值为4
在这里插入图片描述
在这里插入图片描述
时间复杂度:O(N) 空间复杂度:O(1)

class Solution {// 反向中序遍历,当遍历到第k个节点时,返回该节点值public int kthLargest(TreeNode root, int k) {// count用于指示已经查找过的数字个数int count=0;TreeNode p= root;Stack<TreeNode> stack=new Stack<>();while(p!=null||!stack.isEmpty()){if(p!=null){stack.push(p);p=p.right;}else{p=stack.pop();count++;if(count==k) return p.val;p=p.left;}}return 0;}
}
2. 入队

时间复杂度:O(N) 空间复杂度:O(N)

class Solution {public int kthLargest(TreeNode root, int k) {// 在中序遍历的同时,把值加入表中ArrayList<Integer> list = new ArrayList();r(root,list);//话说倒数第k个数,下标是多少来着?诶,倒数第一个数下标是size-1诶,那么倒数第k个数不就是return list.get(list.size() - k);}// 二叉树递归形式中序遍历void r(TreeNode root, List list){if(root == null) return ;r(root.left,list);list.add(root.val);r(root.right,list);}
}
class Solution {public int kthLargest(TreeNode root, int k) {List<Integer> result = new LinkedList<>();Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;while (cur != null || !stack.isEmpty()) {while (cur != null) {stack.push(cur);cur = cur.right;}cur = stack.pop();result.add(cur.val);cur = cur.left;}return result.get(k - 1);}
}

【总结】

1. 二叉搜索树中序遍历 有序递增序列 中序逆序遍历 有序递减序列
2.二叉树遍历
  • 前序遍历 先输出当前结点的数据,再依次遍历输出左结点和右结点
  • 中序遍历 先遍历输出左结点,再输出当前结点的数据,再遍历输出右结点
  • 后续遍历 先遍历输出左结点,再遍历输出右结点,最后输出当前结点的数据
3. 二叉树 递归 栈

转载链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/solution/mian-shi-ti-54-er-cha-sou-suo-shu-de-di-k-da-jie-d/

参考链接::https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/solution/sou-suo-er-cha-shu-de-zhong-xu-bian-li-jiu-shi-di-/

参考链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/solution/fan-xiang-zhong-xu-bian-li-fei-di-gui-die-dai-miao/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425372.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hihocoder 1632 : Secret Poems 思维|技巧

题意 定义一个矩阵 他有n*n大小 然后给出他的真实信息的走法 让我们变换走法 再次把真实信息填入矩阵中 n<100 分析 可以发现原文的读取方式无非就是如此 &#xff08;0,1&#xff09;向左 (1,-1)左下 (1,0)向下 (-1,1)右上 1边界检查 (1,0)向下 (1,-1)左下 (0,…

[Leetcode][第108题][JAVA][将有序数组转换为二叉搜索树][二分法][递归]

【问题描述】[简单] 将一个按照升序排列的有序数组&#xff0c;转换为一棵高度平衡二叉搜索树。本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是&#xff1a;[0,-3…

CF Vicious Keyboard 构造水题

题目说 在给定字符串中 只能改变一个字符的情况下 求最大的VK字符的数量 分析 为了防止出错 这里要注意 为了防止VK判断的时候 不影响其他的判断 对于一个VK 我们最好不要把他删掉删掉后有可能会增加新的VK 就直接用特定值把原来的VK覆盖掉 然后对于剩下的可能 最多只能增…

数据结构:(1)课程总览

“数据结构”课程的内容 “数据结构”在计算机课程体系&#xff08;偏软&#xff09;中的地位 “数据结构”与程序设计类课程的关系 “数据结构”的学习目标 “数据结构”的学习方法

[剑指offer]面试题第[55-1]题[JAVA][二叉树的深度][BFS][DFS]

【问题描述】[简单] 输入一棵二叉树的根节点&#xff0c;求该树的深度。从根节点到叶节点依次经过的节点&#xff08;含根、叶节点&#xff09;形成树的一条路径&#xff0c;最长路径的长度为树的深度。例如&#xff1a;给定二叉树 [3,9,20,null,null,15,7]&#xff0c;3/ \9 …

[剑指offer]面试题第[55-2]题[Leetcode][第110题][JAVA][平衡二叉树][DFS][剪枝]

【问题描述】[中等] 输入一棵二叉树的根节点&#xff0c;判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1&#xff0c;那么它就是一棵平衡二叉树。示例 1:给定二叉树 [3,9,20,null,null,15,7]3/ \9 20/ \15 7 返回 true 。示例 2:给定二叉树…

[Leetcode][第32题][JAVA][最长有效括号][动态规划][栈][正向逆向结合]

【问题描述】[困难] 给定一个只包含 ( 和 ) 的字符串&#xff0c;找出最长的包含有效括号的子串的长度。示例 1:输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()" 示例 2:输入: ")()())" 输出: 4 解释: 最长有效括号子串为 "()()"…

[剑指offer]面试题第[56-2]题[JAVA][数组中数字出现的次数][状态机][hashmap][位运算]

【问题描述】[中等] 在一个数组 nums 中除一个数字只出现一次之外&#xff0c;其他数字都出现了三次。请找出那个只出现一次的数字。示例 1&#xff1a;输入&#xff1a;nums [3,4,3,3] 输出&#xff1a;4 示例 2&#xff1a;输入&#xff1a;nums [9,1,7,9,7,9,7] 输出&…

Nginx多进程高并发、低时延、高可靠机制在缓存(redis、memcache)twemproxy代理中的应用...

1. 开发背景 现有开源缓存代理中间件有twemproxy、codis等&#xff0c;其中twemproxy为单进程单线程模型&#xff0c;只支持memcache单机版和redis单机版&#xff0c;都不支持集群版功能。 由于twemproxy无法利用多核特性&#xff0c;因此性能低下&#xff0c;短连接QPS大约为3…

[Leetcode][第44题][JAVA][通配符匹配][贪心][动态规划]

【问题描述】[困难] 【解答思路】 1. 动态规划 第 1 步&#xff1a;设计状态 dp[i][j]dp[i][j] 表示字符串 ss 的前 ii 个字符和模式 pp 的前 jj 个字符是否能匹配 第 2 步&#xff1a;状态转移方程 第 3 步&#xff1a;考虑初始化 boolean[][] dp new boolean[m 1][n 1];…

annotation

Annotations提供一些本来不属于程序的数据。 注解(Annotation)相当于一种标记&#xff0c;在程序中加入注解就等于为程序打上某种标记&#xff0c;没有加&#xff0c;则等于没有任何标记&#xff0c;以后&#xff0c;javac编译器、开发工具和其他程序可以通过反射来了解你的类及…

43request对象 续

建立一个test.jsp <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset"ISO-8859-1"> <title>Insert title here…

wannafly挑战赛4 C-割草机 思维

时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld 题目描述 有一块n*m的地&#xff0c;每块地要么长满杂草(用’W’表示)&#xff0c;要么是空地(用’G’表示)&#xff0c;现在有一个…

[剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针]

[剑指offer]面试题第[57]题[Leetcode][第167题][第1题] 有序无序之分 题目输出不同之分 以下解法按照[剑指offer]面试题第[57]题进行题解 【问题描述】[简单] 输入一个递增排序的数组和一个数字s&#xff0c;在数组中查找两个数&#xff0c;使得它们的和正好是s。如果有多对数…

44response对象

<% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8" import"java.util.*,java.io.*"%> <%out.println("<h1>response内置对象</h1>");out.println("<hr>&qu…

POJ 1703 Find them, Catch them 种类并查集

题意 给出一堆点和关系 D为两点不同集合 A为查询两点是否不同集合 n<1e5 code #include<cstdio> #include<iostream> #include<algorithm>using namespace std; const int maxn 1e57; int f[maxn],rel[maxn];//rel为0表示与父节点不同类 1为同类 …