标签:node 剪枝 arr return int ArrayList 二叉 搜索 root
相对来说比较简单的一道题目。
第一反应是,搞个数组把整个搜索树搞个排序,然后就完事了。
自然想到,搜索二叉树的中序遍历即是一个升序排列的方式。因为中序排列就是一个先左子树,再root,再右子树的遍历方式。
自然的想到使用递归实现中序遍历:
- 递归函数的作用:将整棵树的节点按中序放到一个ArrayList中
- 递归函数结束条件:节点为null
- 递归函数的逻辑关系:F(root)=F(root.left)+root.val+F(root.right)
class Solution { public ArrayList<Integer> inorder(TreeNode root, ArrayList<Integer> arr) { if (root == null) return arr; inorder(root.left, arr); arr.add(root.val); inorder(root.right, arr); return arr; } public int kthSmallest(TreeNode root, int k) { ArrayList<Integer> nums = inorder(root, new ArrayList<Integer>()); return nums.get(k - 1); } }
显然看出,时间复杂度和空间复杂度都是On
但是我们可以构造一个大小为k的栈,只需要找到第k小的就行了
或者可以搞一个二叉搜索树的剪枝
class Solution { int n = 0; int ans = 0; public int kthSmallest(TreeNode root, int k) { search(root, k); return ans; } private void search(TreeNode node, int k) { if(node!=null) { search(node.left, k); n++; if (n == k) { ans = node.val; } else if (n > k) { return;//剪枝 } search(node.right, k); } } }
标签:node,剪枝,arr,return,int,ArrayList,二叉,搜索,root 来源: https://www.cnblogs.com/take-it-easy/p/13281073.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。