[剑指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)
2. 迭代
如下圖(5,3,7,2,4,6,8) 中,按節點數值大小順序第三小結點的值為4
時間復雜度:O(N) 空間復雜度:O(1)
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/
總結
以上是生活随笔為你收集整理的[剑指offer]面试题第[54]题[JAVA][二叉搜索树的第k大节点][递归][迭代]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LVS 同网段搭建keeplive+lv
- 下一篇: 深入理解 ajax_xhr 对象