改进计算二叉树中节点值最大和的函数的运行时间
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
相关文章:
- JavaScript中的函数和对象之间没有区别吗?
- jQuery加载的async和ready函数不工作
- 为什么不是'我的函数在解析云代码中工作吗?当我在Angular和Express中测试时,它是有效的
- 从js引擎的角度来看闭包和构造函数是如何工作的
- Javascript通过列表项的函数和css来更改背景颜色
- 提交按钮通过JQuery和JavaScript函数所做的更改不会持续
- Knockout JS和简单的函数
- 函数()和新函数()之间的区别
- Javascript重新定义和覆盖现有的函数体
- 命名一个在“”和“”之间切换元素的函数;启用”;以及“;被禁用”;州
- 如何使用jQuery绕过具有指定类和两个条件的元素的函数
- 调用函数和创建函数实例之间的Javascript差异
- XMLHttpRequest:需要使用ajax中的成功和错误函数
- 将 JSDoc 与匿名对象和该对象的函数一起使用的正确方法
- 编写没有加载和.ready函数的JavaScript
- 有人可以帮助我调试带有addClass和removeClass函数的“每个会话一次”cookie吗?
- jquery-ui-rails的draggable和dropable函数不起作用
- php中的函数或介于-200和200之间但不为零的数字
- 在涉及点击和添加类的函数上笨手笨脚
- 改进计算二叉树中节点值最大和的函数的运行时间