一般来说,BST(二叉排序树)有分三种遍历,前序遍历,中序遍历和后序遍历。
前序遍历顺序是根在前的根,左子树,右子树(也是我们一般来表示一棵树的方法)
中序:左子树,根,右子树
后序:左子树,右子树,根
值得注意的是在BST树的中序遍历之中,结果必然是递增的。
于是对于下面这一道题目:
源地址:https://leetcode.com/problems/kth-smallest-element-in-a-bst/#/description
题目:Kth Smallest Element in a BST
描述:
Given a binary search tree, write a function kthSmallest
to find the kth smallest element in it.
Note:
You may assume k is always valid, 1 ≤ k ≤ BST's total elements.
Follow up:
What if the BST is modified (insert/delete operations) often and you need to find the kth smallest frequently? How would you optimize the kthSmallest routine?
由于刚开始所给的是根节点的指针,而其中树的数据结构是自上而下的
所以这使我们对第k小的数据查找出现了困难,这时就想如果能够拥有一个数组,将树中各项从小到大顺序排列,直接查找就好了
于是就想到了复杂度为O(N)的中序遍历,解法如下:
/**
* 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 {
private:
vector<int> nums;
public:
void Traver(TreeNode * root){
if(!root -> left && !root -> right){
nums.push_back(root -> val);
}
else if(root -> left){
Traver(root -> left);
nums.push_back(root -> val);
if(root -> right)
Traver(root -> right);
}
else{
nums.push_back(root -> val);
Traver(root -> right);
}
}
int kthSmallest(TreeNode* root, int k) {
if(root == NULL)return 0;
Traver(root);
return nums[k - 1];
}
};
这或许在时间复杂度之中不算得最优解法,但是却有着简洁明了的优点。