js之-二叉树-实现根节点到子节点所有路径,组成之和

文字:输出根节点到子节点中间所有路径组成的数字之和

例如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输出,知大致逻辑:

  1. 根节点root的val * 10 + 子节点的val,输出根节点到当前节点组成的数字sum
  2. 如果子节点下没有节点,则输出对应数字,如果子节点下还有子节点,则用前面节点路径输出数字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)
};

猜你喜欢

转载自blog.csdn.net/qq_41797950/article/details/105405007
今日推荐