<js>二叉树求和

1,179 阅读1分钟

记录下生活,没什么特别的,只是最近笔试遇到这个问题。笔试两个代码题:

Q1: 二叉树求和

Q2: Object 遍历 (太简单,不写了)

// 二叉树求和
const root = {
    val: 1,
    left: {
        val: 2,
        left: {
            val: 3,
        },
        right: {
            val: 4,
            left: {
                val: 5
            }
        },
    }, right: {
        val: 6,
        right: {
            val: 7
        }
    }
}

const main = root => {
    let sum = getSum(root);   // 中序遍历 根左右
    
    let sum2 = getSum2(root); // 先序遍历 左根右
    rollbackRoot(root,'added'); 

    let sum3 = getSum3(root); // 后序遍历 左右根
    rollbackRoot(root,'added');

    console.log(sum, sum2, sum3); // 1+2+...+7 = 28
}

// 中序遍历 根左右
const getSum = (root, sum = 0) => {
    if (!root) return sum;
    sum += root.val;
    sum = getSum(root.left, sum);
    sum = getSum(root.right, sum);
    return sum;
}

// 先序遍历 左根右
const getSum2 = (root, sum = 0) => {
    if (!root) return sum;
    sum = getSum2(root.left, sum);
    if (!root.added) {
        sum += root.val;
        root.added = 1;
    }
    sum = getSum2(root.right, sum);
    return sum;
}

// 后序遍历 左右根
const getSum3 = (root, sum = 0) => {
    if (!root) return sum;
    sum = getSum3(root.left, sum);
    sum = getSum3(root.right, sum);
        if (!root.added) {
                sum += root.val;
        root.added = 1;
    }
    return sum;
}

const rollbackRoot= (root,nodeName) => {
    if (!root) return;
     root[nodeName] = undefined;
     rollbackRoot(root.left, nodeName);
     rollbackRoot(root.right, nodeName);
     return root; 
}

main(root);