繁体   English   中英

改善函数运行时间,该功能可计算二叉树中节点值的最大和

[英]Improve runtime of function calculating maximum sum of node values in a binary tree

想法是找到值最大的路径(该路径上节点的值之和)。 编辑:节点是完全无序的,这意味着您必须搜索整个路径,以了解一个路径是否会比另一个路径具有更大的价值。

这是树的节点构造函数:

var Node = function(val) {
  this.val = val;
  this.left = null;
  this.right = null;
}

这是计算路径最大值的函数:

function maxPath(top) {
    if (top.right === null || top.left === null) return top.val;
    return Math.max(top.val, Math.max(top.val + maxPath(top.left), top.val + maxPath(top.right)));
}

该函数效率很低,并且只会为大约25层深度的树返回相当快的响应(在一秒钟之内)。 我正在尝试为一棵深100层的树找到最大求和路径,但似乎找不到我的方法。 有没有办法改善运行时间?

错误的答案,因为我不完全理解问题
如果树的数据是静态的,则可以存储从根到顶点的预先计算的和。


下次尝试
尝试删除递归。
但是我认为它不会更快,因为V8已经优化了您的代码。

function getMaxPath (topNode) {
    var node = topNode; 
    var sum = node.val;
    while (node.right) { // binary tree, right? So rigth and left exists together.
        node = (node.right.val >= node.left.val) ? node.right : node.left;
        sum = node.val;
    }
    return sum;
}

下一个!

var sums = []; // array of sum for each leaf
topNode.sum = topNode.val;

function fall(node) {
   if (!node.right) 
       return sums.push(node.sum);

   node.right.sum = node.sum + node.right.val;
   fall(node.right);

   node.left.sum = node.sum + node.left.val;
   fall(node.left);
}

fall(topNode);
console.log(Math.max.apply(Math, sums)); // find max

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM