从零学算法(剑指 offer 54)

给定一棵二叉搜索树,请找出其中第 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

  • 我的思路:纯暴力,遍历树得到所有节点,添加到 list 中,然后 list 排序直接取
  •   List<Integer> list = new ArrayList<>();
      public int kthLargest(TreeNode root, int k) {
          dfs(root);
          Collections.sort(list,(x,y)->y-x);
          return list.get(k-1); 
      }
      void dfs(TreeNode root){
          if(root==null)return;
          list.add(root.val);
          dfs(root.left);
          dfs(root.right);
      }
    
  • 注意题目:二叉搜索树,二叉搜索树的中序遍历为从小到大排序的,那么中序遍历倒序不就得到了递减数组,中序遍历是左根右,那么倒序一下就是右根左。然后用一个 k 计数遍历到几个了即可。
  •   int ans,k;
      public int kthLargest(TreeNode root, int k) {
          this.k=k;
          dfs(root);
          return ans;
      }
      public void dfs(TreeNode root){
          if(root==null)return;
          dfs(root.right);
          // k==0说明已经找到了,所以直接 return
          // 这一步是提升性能的
          if(k==0)return;
          if(--k==0)ans = root.val;
          dfs(root.left);
      }
    

你可能感兴趣的:(算法学习,#,树,算法,深度优先)