有关完全二叉树求节点数和前缀树求字符串是否重复的两道算法题

1.给定一棵完全二叉树的头节点head,求其中的节点个数
递归的方法,时间复杂度为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));
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值