首页 > 解决方案 > 使用递归js在树状对象中查找最小值和最大值

问题描述

我正在尝试使用递归在树状对象中找到最小值和最大值,但我实际上并不了解如何找到这些值。此外,我的函数必须是纯函数,不能使用循环或 forEach。只有 map、reduce、filter 可用。所以这就是我的数据的样子:

const tree = {
children: [ 
    { 
        children: [
            { 
                children: [],
                values: [15.667786122807836]
            }
        ],
        values: [35.77483035532576, 1.056418140526505]
    },
    {
        children: [
            {
                children: [
                    {
                        children: [],
                        values: [67.83058067285563]
                    }
                ],
                values: [98.89823527559626]
            }
        ],
        values: [51.49890385802418, 41.85766285823911]
    },
],
values: [6.852857017193847, 28.110428400306265, 51.385186145220494]};

我正在尝试做这样的事情:

const min = graph => {
if (!graph.children.length && !graph.values.length) return;

if (!graph.children.length && graph.values.length) {
    return Math.min(...graph.values);
}

return graph.children.map(el => {
    const minValue = Math.min(...el.values);
    min(el);
    return minValue;
});

};

但这并不好。所以任何人都可以解释调用堆栈是如何工作的,也许给我一些很好的例子,并解释如何解决我的问题。感谢您的帮助,抱歉英语不好)。哦,还有))如何获得不同深度级别的两个节点之间的距离?

标签: javascriptrecursiondata-structuresbinary-tree

解决方案


我不是 JS 程序员,但我一直在寻求实践。这是我想出的:

const tree = {
  children: [{
      children: [{
        children: [],
        values: [15.667786122807836]
      }],
      values: [35.77483035532576, 1.056418140526505]
    },
    {
      children: [{
        children: [{
          children: [],
          values: [67.83058067285563]
        }],
        values: [98.89823527559626]
      }],
      values: [51.49890385802418, 41.85766285823911]
    },
  ],
  values: [6.852857017193847, 28.110428400306265, 51.385186145220494]
};

function treeMin(graph) {
  if (graph.children.length == 0) return Math.min(...graph.values);
  return Math.min(...graph.values,
                  graph.children.reduce((prev, cur) =>
                     Math.min(prev, treeMin(cur)), Number.MAX_SAFE_INTEGER
                  ));
}

console.log(treeMin(tree));

我给函数起了一个名字来进行递归调用。它做的第一件事是检查是否没有孩子。如果不是,它只返回值的最小值。

如果有孩子,则返回最小值和调用reduce孩子的结果。在内部reduce,进行递归调用。

注意:它不处理values为空的情况。这可以很容易地添加。


推荐阅读