日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [剑指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/

總結

以上是生活随笔為你收集整理的[剑指offer]面试题第[54]题[JAVA][二叉搜索树的第k大节点][递归][迭代]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。