文章目录
- 1. 题目
- 2. 解题
1. 题目
给定一棵有 n 个结点的二叉树,你的任务是检查是否可以通过去掉树上的一条边将树分成两棵,且这两棵树结点之和相等。
样例 1:
输入: 5/ \10 10/ \2 3
输出: True
解释: 5/ 10和: 1510/ \2 3和: 15样例 2:
输入: 1/ \2 10/ \2 20
输出: False
解释: 无法通过移除一条树边将这棵树划分成结点之和相等的两棵子树。注释 :
树上结点的权值范围 [-100000, 100000]。
1 <= n <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/equal-tree-partition
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 自底向上求得每个节点的子树和,更新于节点的 val
- 遍历检查+剪枝,共计2次遍历
class Solution {bool found = false;int allsum;
public:bool checkEqualTree(TreeNode* root) {allsum = sum(root);if(allsum&1) return false;//奇数不可分check(root);return found;}int sum(TreeNode* root){if(!root) return 0;int l = sum(root->left);int r = sum(root->right);return root->val += l+r;}bool check(TreeNode* root){if(!root) return false;if(found) return true;if(root->left && allsum == 2*root->left->val)return found = true;if(root->right && allsum == 2*root->right->val)return found = true;return check(root->left) || check(root->right);}
};
40 ms 31.9 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!