给定两个值 k1 和 k2(k1 < k2)和一个二叉查找树的根节点。找到树中所有值在 k1 到 k2 范围内的节点。即打印所有x (k1 <= x <= k2) 其中 x 是二叉查找树的中的节点值。返回所有升序的节点值。
您在真实的面试中是否遇到过这个题? Yes
样例
如果有 k1 = 10
和 k2 = 22
, 你的程序应该返回 [12, 20, 22]
.
20
/ \
8 22
/ \
4 12
其实,一开始看到这个问题,有点像是线段树。
思路: 将问题想明白,利用所给出的数据结构所具有的性质。
问题的本质就是进行二叉查找树的中序遍历,不过在访问节点的时候加上了一些条件。
so easy, 二叉查找树,利用中序遍历,就可以从小到大进行输出了;
/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right = NULL; * } * } */ class Solution { public: /** * @param root: The root of the binary search tree. * @param k1 and k2: range k1 to k2. * @return: Return all keys that k1<=key<=k2 in ascending order. */ /* 其实,一开始看到这个问题,有点像是线段树。 思路: 将问题想明白,利用所给出的数据结构所具有的性质。 问题的本质就是进行二叉查找树的中序遍历,不过在访问节点的时候加上了一些条件。 so easy, 二叉查找树,利用中序遍历,就可以从小到大进行输出了; */ vector<int> vec; vector<int> searchRange(TreeNode* root, int k1, int k2) { // write your code here if(root==NULL){ return vec; } if(root->left!=NULL){ searchRange(root->left,k1,k2); } if(root->val>=k1&&root->val<=k2){ vec.push_back(root->val); } if(root->right!=NULL){ searchRange(root->right,k1,k2); } return vec; } };