[剑指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,一经查实,立即删除!

相关文章

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

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

数据结构:(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];…

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…

[剑指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…

45请求转发和请求重定向区别

请求转发 定义一个response的jsp文件 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8" import"java.util.*,java.io.*"%> <%out.println("<h1>response内置对象</h1>&qu…

[签名算法]DSA 算法

DSA&#xff08;Digital Signature Algorithm&#xff09;是Schnorr和ElGamal签名算法的变种&#xff0c;被美国NIST作为DSS(DigitalSignature Standard)。 DSA是基于整数有限域离散对数难题的。 DSA是一种更高级的验证方式。一般用于数字签名和认证。DSA 不单单只有公钥、私钥…

[Leetcode][第63题][JAVA][不同路径2][动态规划][压缩路径]

【问题描述】[中等] 【解答思路】 1. 动态规划流程 第 1 步&#xff1a;设计状态 第 2 步&#xff1a;状态转移方程 第 3 步&#xff1a;考虑初始化 第一行第一列 没有遇到“障碍” 就为1 如果u&#xff08;i&#xff0c;j&#xff09;0 直接返回 0 第 4 步&#xff1a;考虑…

47session 方法

定义一个page1 <% page language"java" import"java.util.*,java.text.*" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset"utf-8"&…