JSFiddle - React, Tailwind, and code Playground
by twobin
HTML
<!doctype html>
<body>
<div id="test"></div>
</body>
</html>
JavaScript
//资料在最深一层,找到一个最佳的打开顺序,使得数字和最大
(function(window){
var
//初始化最大值
max = 0,
//记录遍历结点的值
levelPath = [],
finalKeyPathStr = '',
ShortPathVal = window.ShortPathVal= function(dataArr){
trvaseGraph(createGraph(dataArr),max);
return finalKeyPathStr;
}
//邻接表的形式创建无向图
function createGraph(arr){
var
//头结点
head={},
//父结点的数组,每个父节点都包括左/右子结点
lastLevelObjects=[];
for(var i=0;i<arr.length;i++){
var newArr= arr[i].split(","),
levelObjects=[];
for(var j=0;j<newArr.length;j++){
var o={};
o.value = newArr[j];
o.level = i+1;
levelObjects.push(o);
if(j===0 && i===0){
//设置头结点
head=o;
break;
}
if(j-1>=0)
//设置右边的子结点
lastLevelObjects[j-1].rightObject=o;
if(j<lastLevelObjects.length)
//设置左边的子结点
lastLevelObjects[j].leftObject=o;
}
//重置lastLevelObjects为对象(当前的level属性的值)数组
lastLevelObjects=levelObjects;
}
return head;
}
//递归遍历图找出求得最大值的路线
function trvaseGraph(start,currentValue){
//保证levelPath的长度小于当前结点的level属性值,避免多余的“脏”数据
while(levelPath.length>=parseInt(start.level)) levelPath.pop();
levelPath.push(start.value);
if(start.leftObject==null && start.rightObject==null){
//在当前遍历中遍历到最后一层子结点的value和值
currentValue +=parseInt(start.value);
if(max<currentValue){
var route="";
//重置max
max=currentValue;
for(var i=levelPath.length-2;i>=0;i--){
route=levelPath[i]+'-->'+route;
}
route+=levelPath[levelPath.length-1];
finalKeyPathStr="Path:"+route+" MaxValue:"+max;
}
return;
}
//在当前遍历中未遍历到最后一层子结点的value和值
currentValue+=parseInt(start.value);
if(start.leftObject!=null){
//遍历左边子结点
trvaseGraph(start.leftObject,currentValue);
}
if(start.rightObject!=null){
//遍历右边子结点
trvaseGraph(start.rightObject,currentValue);
}
}
})(window)
var dataArr =["188",
"188,112",
"105,105,194",
"142,166,191,129",
"171,172,134,127,127",
...