如题
很显然需要用到递归,但是不适合从上至下穷举,那样对元素和的运算会有浪费。那么转换流程为从底部开始运算,计算节点坡度的同时缓存元素和
static int num=0; //坡度
public static int findTilt(TreeNode root) {
Sum(root); //包括自己在内的子元素之和
return num;
}
static int Sum(TreeNode root) {
if(root == null) {
return 0;
}
int lsum=Sum(root.left);//左子树元素和
int rsum=Sum(root.right);//右子树元素和
num+=Math.abs(lsum-rsum);//加上当前左右子树差
return root.val+lsum+rsum;
}
提交时去掉static,很直观的写法,直接递归求子树元素和。
换一种写法,直接通过return控制递归findTilt方法
public static int findTilt1(TreeNode root) {
if(root !=null) {
if(root.left!=null) {
findTilt1(root.left); //递归更新val及num 注意不能return
}
if(root.right!=null) {
findTilt1(root.right);
}
root.val=root.val+(root.left==null?0:root.left.val)+(root.right==null?0:root.right.val);//更新节点元素为子树所有元素之和
num+=Math.abs((root.left==null?0:root.left.val)-(root.right==null?0:root.right.val)); //更新num
}
return num;
}
仅仅是写法不一样,结果是完全相同的