Question:
Given a Binary Search tree of integers, you need to return the number of nodes having values between two given integers. You can assume that you already have some extra information at each node (number of children in left and right subtrees !!)
Solution:
这题有几个需要说明的地方.
1)这题表示可以知道额外的信息,比如左右子节点的总数.
2)这题只需要返回节点的个数即可,不必遍历节点.
因此这题有一个特别巧妙的方法.前提是知道左子树节点总数.
1)找到小于(或等于)high的总数h
2)找到小于(或等于)low的总数l;
3)return h-l;
Struct TreeNode {
TreeNode * left, * right;
int val, left_subtree_size;
};
int getLess(TreeNode* node, int v) {
if (node == NULL)
return 0;
if (v <= node->val)
return getLess( node->left , v);
return 1 + node->left_subtree_size + getLess(node->right, v);
}
int Solve(TreeNode * root , int from, int to) {
return getLess(root, to+1) - getLess(root, from); // to+1 to get #values <= to
}