http://www.1point3acres.com/bbs/thread-206843-1-1.html
Line 17 and Line 19 多余的,请忽略。因为post-order traversal时已经检查过左右child nodes了。
第二题 求一个二叉查找数中,最大的subtree的size in range [A, B]。
因为一个tree的node范围是否在区间[A,B]可以很容易由他的左右子树的范围以及根的value来决定,所以可以用post-order traversal O(N)时间遍历整个tree, 同时注意不断更新最大满足区间范围子树的node count. 注意:在遍历过程中,若判定一个子树满足区间范围时一定要及时记录其node count以备parent trees使用。
第二题 求一个二叉查找数中,最大的subtree的size。subtree所有元素都必须在范围[A,B]之间。O(n)。 |
这个题是找最大的满足条件的subtree,一个subtree是必须某个node和其所有子孙nodes. 在判断 “if(left<=root->val&&right>=root->val) { res=1+left_num+right_num; }”时,应该先判断left/right subtree是否满足条件再更新res吧。这个help function应该加一个invalid default return value (any negative value is OK),表示该subtree不是在[left, right]范围内的。否则例如对于一个简单的3 nodes的tree:root=1, left node = 100, right node = 100, 范围[0, 2],本来是没有这样的subtree,但原code返回1.
稍改动加个default value就可以了。
稍改动加个default value就可以了。
left_sum 和 right_sum应该check是不是-1?是的话说明subtree已经不合法了,然后直接返回-1?最后检测root.val 的时候也应该是如果它不在范围里面直接返回-1?
- int Result; // global variable to store node count of max valid subtree
- . Waral 鍗氬鏈夋洿澶氭枃绔�,
- // main function. Waral 鍗氬鏈夋洿澶氭枃绔�,
- int getSubTreeSize(Node* root, int left, int right) {
- Result = -1; // default node count if subtree invalid
- helper(root, left, right);
- return Result;
- }
- -google 1point3acres
- // get node count of subtree rooted at "root" if valid; otherwise, return -1
- int helper(Node* root, int left, int right) {
- if (root == NULL) return 0;
- int left_num = helper(root->left, left, right);
- int right_num = helper(root->right, left, right);
- int res = -1; // default node count if subtree invalid
- if (left_num >= 0 && right_num >= 0 && left <= root->val && right >= root->val) {.鐣欏璁哄潧-涓€浜�-涓夊垎鍦�
- res = left_num + right_num + 1; // update node count only if valid
- Result = max(Result, res); // update global result
- }. From 1point 3acres bbs
- return res;
- }
- //maxsubsize
- public static class TreeNode{
- TreeNode left;
- TreeNode right;
- int val;
- public TreeNode(int val){
- this.val = val;
- }
- }
- static int max = -1;
- public static int maxSubsize(int A, int B, TreeNode root){
- if(root == null) return 0;
- if(root.val < A || root.val > B) return -1;.1point3acres缃�
- int left = maxSubsize(A, B, root.left);
- int right = maxSubsize(A, B, root.right);
- if(left == -1 || right == -1){
- return -1;
- }
- if(left != -1 && right != -1){.鐣欏璁哄潧-涓€浜�-涓夊垎鍦�
- max = Math.max(1 + left + right, max);
- return 1 + left + right;.1point3acres缃�
- }
- return -1;
- }
Line 14: if(root.val < A || root.val > B) return -1;
这一行不应该立即返回吧。这样如果root node value一旦不在区间[A,B]范围内就不再检查子树范围了。例如给定范围[3,4]和一个3结点的tree: root = 1, left child = 2, right child = 3. 最大subtree size应该是1,不应该返回-1.
这一行不应该立即返回吧。这样如果root node value一旦不在区间[A,B]范围内就不再检查子树范围了。例如给定范围[3,4]和一个3结点的tree: root = 1, left child = 2, right child = 3. 最大subtree size应该是1,不应该返回-1.
Line 17 and Line 19 多余的,请忽略。因为post-order traversal时已经检查过左右child nodes了。
第二题 求一个二叉查找数中,最大的subtree的size in range [A, B]。
因为一个tree的node范围是否在区间[A,B]可以很容易由他的左右子树的范围以及根的value来决定,所以可以用post-order traversal O(N)时间遍历整个tree, 同时注意不断更新最大满足区间范围子树的node count. 注意:在遍历过程中,若判定一个子树满足区间范围时一定要及时记录其node count以备parent trees使用。
- // global variables.鐣欏璁哄潧-涓€浜�-涓夊垎鍦�
- int low, high; // range low and high bounds.鏈枃鍘熷垱鑷�1point3acres璁哄潧
- int maxSubTreeSize = 0; // max subtree size in [low,high]
- struct Node {
- int val; Node* left, *right;
- Node(int v) :val(v), left(NULL), right(NULL) {}
- };
- // true if tree rooted at x is in range [low,high]
- // count: node count if tree in range
- bool checkRange(Node* x, int& count) {
- if (!x) { count = 0; return true; }
- int leftCount, rightCount;
- // do post-order traversal to update maxSubTreeSize
- bool leftInRange = checkRange(x->left, leftCount);
- if (leftInRange) maxSubTreeSize = max(maxSubTreeSize, leftCount);
- bool rightInRange = checkRange(x->right, rightCount);
- if (rightInRange) maxSubTreeSize = max(maxSubTreeSize, rightCount);
- if (leftInRange && rightInRange && x->val >= low && x->val <= high) {. From 1point 3acres bbs
- count = leftCount + rightCount + 1;
- maxSubTreeSize = max(maxSubTreeSize, count);
- return true;
- }
- else return false;
- }
- int getMaxSubTreeSize(Node* r, int a, int b) {
- low = a; high = b; int count = 0;
- checkRange(r, count);
- return maxSubTreeSize;
- }