BST中第K小的元素
来源:互联网 发布:红帽linux防火墙关闭 编辑:程序博客网 时间:2024/05/17 07:29
Leetcode中求二叉搜索树第K小的数,
1. 引入一个变量记录当前节点左子树中节点的个数。
如果频繁操作该树,并且频繁的调用kth函数,可以通过引入一个变量,记录该节点的左子树中节点的个数(其实就是有多少个节点比该节点小),使时间复杂度降低至O(h)(h是树的高度)。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: int kthSmallest(TreeNode* root, int k) { if (root == NULL || k < 1) return NULL; int cnt = countNodes(root->left); if (k <= cnt) return kthSmallest(root->left, k); else if (k > cnt + 1) return kthSmallest(root->right, k-1-cnt); <span style="font-family: Arial, Helvetica, sans-serif;">//当前节点算一个节点</span> return root->val; } //统计当前节点左子树中节点的个数 int countNodes(TreeNode* root) { if (root == NULL) return 0; return countNodes(root->left) + countNodes(root->right) + 1; }};
2. 中序遍历
二叉搜索树的一个特性就是中序遍历的结果就是树内节点从小到大顺序输出的结果。采用迭代形式可以在找到第k小节点时马上退出。2.1 迭代
需要用栈来做,思路是从根节点开始,先将根节点压入栈,然后再将其所有左子结点压入栈,然后取出栈顶节点,记录数了几个数了,如果正好是k个,则返回节点值;否则再将当前指针移到其右子节点上,若存在右子节点,则在下次循环时又可将其所有左子结点压入栈中。这样就保证了访问顺序为左-根-右。
class Solution {public: int kthSmallest(TreeNode* root, int k) { int cnt = 0; stack<TreeNode*> s; TreeNode *p = root; while (p || !s.empty()) { while (p) { s.push(p); p = p->left; } p = s.top(); s.pop(); ++cnt; if (cnt == k) return p->val; p = p->right; } return 0; }};
2.2 递归
递归方法就是对左子结点调用递归函数,判断根节点访问值,右子节点再调用递归函数.
class Solution {public: void DFS(TreeNode *node) { if (node == NULL) return; if (node->left) DFS(node->left); cnt --; if (cnt == 0) { val = node->val; return; } if (node->right) DFS(node->right); } int kthSmallest(TreeNode* root, int k) { cnt = k; DFS(root); return val; }private: int cnt; int val;};
0 0
- BST中第K小的元素
- Kth Smallest Element in a BST 寻找二叉排序树中第k小元素
- Kth Smallest Element in a BST 找二叉搜索树中的第k小的元素
- LeetCode OJ 之 Kth Smallest Element in a BST(BST中的第k小元素)
- 第k小的元素
- 230. Kth Smallest Element in a BST | 二叉排序树中查找第K小的数
- 求数组中第k个小的元素
- 找n个数字中第k小的元素
- 查找数组中第k小的元素
- leetcode_230. Kth Smallest Element in a BST 求二叉搜索树中的第k小的元素,中序遍历法
- 寻找数组中第k小元素
- leetcode230---Kth Smallest Element in a BST(BST中寻找第K小)
- 查找数组中第K大和第K小的元素
- 第K小元素
- 第 k 小 元素
- 查找第K小的元素
- 在BST中找到第k大的数
- [C++]Kth Smallest Element in a BST 在一个二叉排序树中找第k小的元素
- 8大排序算法图文讲解
- "xliff:g"标签
- MYSQL定时调度执行SQL语句
- 有了深度学习,传统的机器学习算法没落了吗,还有必要去学习吗?
- [数据结构与算法]二叉树与二叉树遍历
- BST中第K小的元素
- 如何学习
- HDOJ 5339 Untitled
- oracle学习笔记-用户与权限管理-(12)
- HDU 4609 3-idiots(FFT)
- 判断Java文件输入流FileInputStream中是否有内容
- 【第七周项目1-建立顺序环形队列算法库】
- 买卖股票的最佳时机|_1
- 使用RoundedBitmapDrawable快速生成圆角和圆形图片