题目地址:
https://leetcode.com/problems/equal-tree-partition/
给定一棵二叉树,允许剪断一个树枝,这样能生成两棵树,问是否存在一条树枝,使得其被剪断后产生的两棵树的节点和相等。
实际上就是问这棵二叉树是否存在一棵真子树,其节点和等于总节点和的一半。可以两遍DFS,第一遍算出整棵树的节点和,第二遍查看是否有某棵子树的节点和恰好等于整棵树节点和的一半。代码如下:
public class Solution {
private boolean res;
private int sum;
public boolean checkEqualTree(TreeNode root) {
sum = dfs(root, root);
if (sum % 2 != 0) {
return false;
}
// 将答案初始化为false
res = false;
dfs(root, root);
return res;
}
// 返回cur为根的子树的节点和
private int dfs(TreeNode cur, TreeNode root) {
if (cur == null) {
return 0;
}
int left = dfs(cur.left, root), right = dfs(cur.right, root);
if ((left + right + cur.val) * 2 == sum && cur != root) {
res = true;
}
return left + right + cur.val;
}
}
class TreeNode {
int val;
TreeNode left, right;
public TreeNode(int val) {
this.val = val;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( h ) O(h) O(h)。