文字:输出根节点到子节点中间所有路径组成的数字之和
例如1:
let root = {
val: 1,
left: {
val: 2,
left: null,
right: null,
},
right: {
val: 3,
left: null,
right: null,
}
};
// 输出 12 + 13 = 25
根据输出,得出逻辑:
(root.val * 10 + root.left.val) +
(root.val * 10 + root.right.val) = 结果
例如2:
let root = {
val: 1,
left: {
val: 2,
left: {
val: 4,
left: null,
right: null
},
right: {
val: 5,
left: null,
right: null
}
},
right: {
val: 3,
left: null,
right: null,
}
};
// 124 + 125 + 13 = 262
根据输出,得出逻辑:
(root.val * 10 + left.val) * 10 + left.left.val +
(root.val * 10 + left.val) * 10 + left.right.val +
root.val*10 + right.val = 结果
结合案例1输出,知大致逻辑:
- 根节点root的val * 10 + 子节点的val,输出根节点到当前节点组成的数字sum
- 如果子节点下没有节点,则输出对应数字,如果子节点下还有子节点,则用前面节点路径输出数字sum * 10 + 当前节点的val
递归 结合 es6方法
function sumMation( root , sum=0 ){
// 先算出两个分支的val 组成的数字
sum = sum*10 + root.val;
// 判断left与right是否还有子节点
// 都没有的话,return 上面求出的数字
if(!root.left && !root.right) return sum;
// 有的话,继续自调用,传入当前节点的left子节点与right子节点,和已经求出的前面分支的数字
return sumMation(root.left, sum) + sumMation(root.right , sum)
};
假设存在这种二叉树: left下有子节点,right下没有,用上面递归方法则会报错
let root2 = {
val: 1,
left: {
val: 2,
left: null,
right: null,
},
right: {
val: 3,
left:{
val: 2,
left: null,
right: null,
},
right: null,
}
};
稍加处理后的函数
function sumMationTwo( root , sum=0 ){
// 先算出两个分支的val 组成的数字
sum = sum*10 + root.val;
// 判断是否还有子节点
// 都没有,return 上面求出的数字
if(!root.left && !root.right) return sum;
// 有子节点
// left有子节点,right无
if( !!root.left && !root.right ) return sumMationTwo(root.left, sum) + sum;
// left无子节点,right有
if( !root.left && !!root.right ) return sumMationTwo(root.right, sum) + sum
// left-right下都有子节点
return sunThree(root.left, sum) + sumMationTwo(root.right , sum)
};