最近在一次采访中被问到这个问题并且感到难过。
给定一个二叉树,其中节点包含整数值,找到总和最小值的路径(一直向下到叶子)。
所以从root开始并以深度优先的方式一直向下遍历,直到你得到一个叶子并沿途添加节点值。对叶子的每条可能路径重复。
我对可能存在的可能性感到不知所措。但我试着做一个dfs,一路上加上值,直到我得到一片叶子。在hashmap中存储路径和总和。但后来我无法弄清楚如何重置当前的总和,并在第二次沿着不同的路径走向不同的路径。
答案 0 :(得分:0)
可以通过以下方式解决:想象一下我们定义函数lowestValuePath(path, currentValue, bst)
,它将路径作为字符串表示(“lrlrr”相当于左,右,左,右,右) ,一个值,它是沿此路径的节点值的当前累积总和,以及bst是要遍历的树。
我们的起始案例是lowestValuePath("", 0, rootNode)
,终止将发生在一个叶子上,返回遍历的路径和沿此路径累积的值。
Java-ish伪代码可以是:
TraverseResult {
String path;
int value;
}
TraverseResult lowestValuePath(path, currentValue, bst) {
val newValue = currentValue + bst.getNodeValue();
if bst.isLeaf():
return new TraverseResult(path, newValue);
else
val rightPath = lowestValuePath(path + "r", newValue, bst.getRightNode());
val leftPath = lowestValuePath(path + "l", newValue, bst.getLeftNode());
return leftPath < rightPath ? leftPath : rightPath
}
可能需要对空树进行一些特殊情况处理..
答案 1 :(得分:0)
如果它是&#34;二进制搜索树&#34;,那么对于每个节点T: 左(T)&lt; = T&lt; =右(T)
所以实际上只是一直向左转,你会得到最低值。