1.给定一棵完全二叉树的头节点head,求其中的节点个数
递归的方法,时间复杂度为O((logN)²)
2.规定一个字符串类型的数组,其中不含有重复的字符串,如果其中某一个字符串是另一个字符串的前缀,返回true;如果没有任何一个字符串是另一个字符串的前缀,返回false
前缀树,把字符挂在边上,只需要把字符串都遍历一遍即可解决,若一个字符串遍历结束之后没有添加边,则其为之前的一个字符串的前缀,若其遍历到另一个字符串的结尾节点之后还需要添加边,则之前的字符串为当前字符串的前缀
递归的方法,时间复杂度为O((logN)²)
首先递归出头节点的左子树的最大深度H,之后再递归头节点的右子树的深度是否等于H,若相等则表示,头节点的左子树加上头节点的节点数为2^(H-1)-1+1,递归头节点的右子树即可。若头节点的右子树的深度为H-1,则表示头节点的右子树加上头节点的总节点数为2^(H-2)-1+1,遍历头节点的左子树即可。
public static int bs(Node node, int l, int h){
if(l == h){
return 1;
}
if(mostLeftLevel(node.right, l+1) == h){
return (1 << (h-l)) + bs(node.right, l +1, h);
}else{
return (1 << (h - l - 1)) + bs(node.left, l + 1, h);
}
}
public static int mostLeftLevel(Node node, int level){
while(node != null){
level++;
node = node.left;
}
return level - 1;
}
2.规定一个字符串类型的数组,其中不含有重复的字符串,如果其中某一个字符串是另一个字符串的前缀,返回true;如果没有任何一个字符串是另一个字符串的前缀,返回false
前缀树,把字符挂在边上,只需要把字符串都遍历一遍即可解决,若一个字符串遍历结束之后没有添加边,则其为之前的一个字符串的前缀,若其遍历到另一个字符串的结尾节点之后还需要添加边,则之前的字符串为当前字符串的前缀
public static class Tries{
private HashMap<Character, Tries> children = new HashMap<Character, Tries>();
private boolean end = false;
public boolean addAndCheck(char[] chs, int i){
if(end){
return true;
}
if(i == chs.length){
end = true;
return !children.isEmpty();
}
if(!children.containsKey(chs[i])){
children.put(chs[i], new Tries());
}
return children.get(chs[i].addAndCheck(chs, i + 1));
}
}