如何在未排序的树中查找小于N的数字。我在接受采访时被问到了这个问题。我的回答是我应该检查从根开始的所有节点,否则我将首先订购树。还有其他想法吗?
答案 0 :(得分:1)
如果它是未排序的树,则必须按定义检查每个节点。如果您要检查除一个节点以外的所有节点,则无法在不检查最后一个节点的情况下判断是否应将计数增加1。
假设您不允许修改树(大多数问题,例如您不喜欢修改结构),您肯定会查看O(n)
解决方案。然而,问题就变成了实施解决方案的最佳方式。因为它是一棵树,答案(以及面试官正在寻找的东西)几乎肯定是递归。
如果我们有一个类似于此的类(我假设树的一般情况。如果它是二叉树,只需用左和右替换孩子):
public class TreeNode{
private int val;
private Set<TreeNode> children;
}
然后我们可以在类中添加一个小于N的方法:
public class TreeNode{
private int val;
private Set<TreeNode> children;
public int lessThanNCount(int n){
int count = (val < n ? 1 : 0);
if(children != null){
for(TreeNode tn : children){
count += tn.lessThanNCount(n);
}
}
return count;
}
}
如果您的目标是汇总数字,而不是计算数字,那么试试这个:
public class TreeNode{
private int val;
private Set<TreeNode> children;
public ArrayList<Integer> lessThanNVals(int n){
ArrayList<Integer> vals = new ArrayList<Integer>();
if(val < n) vals.add(val);
if(children != null){
for(TreeNode tn : children){
vals.addAll(tn.lessThanNCount(n));
}
}
return vals;
}
}