230.Kth Smallest Element in a BST
Posted 我的名字叫周周
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了230.Kth Smallest Element in a BST相关的知识,希望对你有一定的参考价值。
/* * 230.Kth Smallest Element in a BST * 2016-6-14 By Mingyang * 我的第一个想法就是这个题目肯定用dfs,然后我们可以用stack来做,也可以直接dfs来做 * 后面又遇到改进型算法,不过时间都差不多 */ private static int number = 0; private static int county = 0; public int kthSmallest1(TreeNode root, int k) { county = k; dfs(root); return number; } public void dfs(TreeNode root) { if (root == null) return; dfs(root.left); county--; if (county == 0) { number = root.val; return; } dfs(root.right); } public int kthSmallest(TreeNode root, int k) { Stack<TreeNode> stack = new Stack<TreeNode>(); TreeNode p = root; int result = 0; // 不断的dfs,利用左中右的遍历方式进行遍历,然后依次取到最后的值 while (!stack.isEmpty() || p != null) { if (p != null) { stack.push(p); p = p.left; } else { TreeNode t = stack.pop(); k--; if (k == 0) result = t.val; p = t.right; } } return result; } // 我的方法更快,利用左子树和右字数的个数的关系,如果k大于左子树的个数,那么就可以往右边走,这种方法复杂度T(n)=2T(n/2)+logn,也就是n //这里用了Binary Search的方法,根据count的大小来判断在哪个区间,然后去那个区间search,所以按理来说应该是logn,可是因为count用了n,所以总的时间就是n,哈哈! public int kthSmallest2(TreeNode root, int k) { int count = countNodes2(root.left); if (k <= count) { return kthSmallest2(root.left, k); } else if (k > count + 1) { return kthSmallest2(root.right, k-1-count); // 1 is counted as current node } return root.val; } public int countNodes2(TreeNode n) { if (n == null) return 0; return 1 + countNodes2(n.left) + countNodes2(n.right); }
以上是关于230.Kth Smallest Element in a BST的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode 230. Kth Smallest Element in a BST
Leetcode 230. Kth Smallest Element in a BST
230.Kth Smallest Element in a BST
230. Kth Smallest Element in a BST