每天一道LeetCode-----寻找二叉搜索树中第k小的元素
2017-12-21 15:22
627 查看
Kth Smallest Element in a BST
原题链接Kth Smallest Element in a BST给顶一个二叉搜索树的根节点,找到这棵数第k小的值
两种方法
递归法的中序遍历
迭代法的中序遍历
递归法,常规的中序遍历
代码如下
/** * 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) { int res = 0; inOrder(root, k, res); return res; } private: void inOrder(TreeNode* root, int& k, int& res) { if(!root || !k) return; inOrder(root->left, k, res); //找到k个数即可 if(--k == 0) res = root->val; inOrder(root->right, k, res); } };
迭代法,用栈实现
/** * 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) { stack<TreeNode*> s; pushAllLeft(root, s); TreeNode* top = nullptr; while(k--) { top = s.top(); s.pop(); //每弹出一个节点就将该节点的右子树的左边一列入栈 pushAllLeft(top->right, s); } return top->val; } private: void pushAllLeft(TreeNode*root, stack<TreeNode*>& s) { while(root) { s.push(root); root = root->left; } } };
本题主要考察中序遍历,除了递归法最好可以熟悉迭代法的求解
相关文章推荐
- 每天一道LeetCode-----寻找地增序列中第一个大于等于目标元素的位置
- 每天一道LeetCode-----有序数组循环右移n位后,寻找最小值,数组中可能包含重复元素
- 每天一道LeetCode-----摩尔投票法寻找给定数组中出现个数大于n/2或n/3的元素
- 每天一道LeetCode-----二叉搜索树的某两个节点被交换位置,修正这个二叉搜索树
- 每天一道LeetCode-----给定一个矩阵,如果某个元素是0,就将所在行所在列上所有元素否置0
- 每天一道LeetCode-----从右向左观察一棵二叉树,返回能看到的元素
- 每天一道LeetCode-----寻找给定字符串中重复出现的子串
- [LeetCode] Kth Smallest Element in a BST 二叉搜索树中的第K小的元素
- 【leetcode】——从两个有序数组中寻找他们并集的第k小元素
- 每天一道LeetCode-----在给定数组中找到一个子数组,使得这个子数组的元素乘积最大
- 每天一道LeetCode-----找到给定序列中所有和为某个值的集合或集合个数,序列中可以有/无重复项,集合元素顺序不同算不同集合等
- leetcode—从两个有序数组中寻找他们并集的第k小元素(思路)
- 每天一道LeetCode-----在有序的二维数组中查找某个元素
- 每天一道LeetCode-----从有序数组中删除重复元素
- leetcode 501. Find Mode in Binary Search Tree 寻找出现最多次数的元素 + 二叉搜索树BST的中序遍历
- 每天一道LeetCode-----给定大小为n+1的数组,元素大小在[1 : n]之间,只有一个元素会重复出现多次,找到重复的那个
- [LeetCode题解]从两个有序数组的并集中寻找第k小元素
- 每天一道LeetCode-----实现二叉搜索树的迭代器
- 每天一道LeetCode-----数组序列,每个元素的值表示最多可以向后跳多远,计算最少跳多少次可以到达末尾
- 每天一道LeetCode-----找到1,2,...,n这n个数所有的组合,每个组合有k个元素,且元素大小递增