剑指offer-二叉搜索树的第k个结点
2016-11-07 20:07
281 查看
题目描述
给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
分析
通过中序遍历列出节点顺序列表
更加优化的解决办法是直接在遍历的时候将k值带进去O(k)-O(n)
O(k):
给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
分析
通过中序遍历列出节点顺序列表
更加优化的解决办法是直接在遍历的时候将k值带进去O(k)-O(n)
import java.util.ArrayList; /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { TreeNode KthNode(TreeNode pRoot, int k) { if (pRoot == null) { return null; } ArrayList<TreeNode> list = new ArrayList<TreeNode>(); inOrderTree(pRoot, list); if (list.size() < k || k == 0) { return null; } else { return list.get(k-1); } } private void inOrderTree(TreeNode pRoot, ArrayList<TreeNode> list) { if(pRoot == null) { return; } inOrderTree(pRoot.left, list); list.add(pRoot); inOrderTree(pRoot.right, list); } }
O(k):
int cnt = 0; TreeNode KthNode(TreeNode pRoot, int k) { if (pRoot == null) return null; TreeNode t = KthNode(pRoot.left, k); if (t != null) return t; if (++cnt < k) return KthNode(pRoot.right, k); else if (cnt == k) return pRoot; return null; }
相关文章推荐
- 剑指offer 二叉搜索树的第k个结点
- 剑指offer 编程题(59):二叉搜索树的第k个结点
- 剑指offer 63题 【树】二叉搜索树的第k个结点
- 剑指offer(六十二)之二叉搜索树的第k个结点
- 剑指offer-62.二叉搜索树的第k个结点
- 剑指offer——二叉搜索树的第k个结点
- 剑指offer-面试题63-二叉搜索树的第k个结点
- 剑指offer-二叉搜索树的第k个结点
- 剑指offer——62.二叉搜索树的第k个结点
- 剑指Offer------二叉搜索树的第k个结点
- 剑指offer(C++)——二叉搜索树的第k个结点
- [剑指offer]二叉搜索树的第k个结点
- 【剑指Offer学习】【面试题63:二叉搜索树的第k个结点】
- 【剑指Offer】面试题63:二叉搜索树的第k个结点
- 剑指offer:二叉搜索树的第k个结点(考点:中序遍历)
- 剑指Offer—62—二叉搜索树的第k个结点
- 剑指offer—二叉搜索树的第K个结点
- (C++)剑指offer-62:二叉搜索树的第k个结点(树)(再理解)
- 【剑指Offer】二叉搜索树的第k个结点
- 剑指offer-面试题63:二叉搜索树的第K个结点