统记完全二叉树的个数

过程如下:

  1. 如果head==null,直接返回0
  2. 如果不是空树,就求树的高度,求法是找到树的最左边节点,看能到哪一层。层数记为h
  3. 接下来就是具体的逻辑,是通过一个递归函数来实现的,bs(node,l,h),node表示当前节点,l表示node所在的层数,h表示整棵树的层数,是始终不变的。bs(node,l,h)返回值表示以node为头的完全二叉树的节点数,初始时node为头节点head,l为1,具体过程可以用下面的例子来说明:
    在这里插入图片描述
    就像上面这个图,从根节点开始,节点右子树的最左节点,能到达最后一层,所以此时根节点的左子树是蛮叉树,并且层数为h-l层,其节点个数为2^(h-l) -1个,如果再加上它自己就是2^ (h-l)个。如果当前节点的右子树的最左节点到达不了最后一层,如下图:
    在这里插入图片描述
    说明此时当前节点的右子树是满二叉树,其节点个数加上自己为2^(h-l-1)个。具体代码如下:
public static class Node {
		public int value;
		public Node left;
		public Node right;

		public Node(int data) {
			this.value = data;
		}
	}

	public static int nodeNum(Node head) {
		if (head == null) {
			return 0;
		}
		return bs(head, 1, mostLeftLevel(head, 1));
	}

	public static int bs(Node node, int l, int h) {
		if (l == h) {   //只有一个节点的时候直接返回1    //这是递归的终止条件
			return 1;
		}
		if (mostLeftLevel(node.right, l + 1) == h) {
			return (1 << (h - l)) + bs(node.right, l + 1, h);  //这个是逻辑左移相当于是2的幂
		} 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;  //这个是求当前节点的左子树所能到达的最深的层次,注意返回的时候要减1,因为它最终的结果要比实际的要多1
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Master_Yoda

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值