算法题0009 | 求完全二叉树结点个数
Posted Explosive
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法题0009 | 求完全二叉树结点个数相关的知识,希望对你有一定的参考价值。
1.题目
已知一棵完全二叉树,求其结点的个数。
2.要求
时间复杂度低于O(N),N为这棵树的结点个数。
3.解法
注:可利用满二叉树结点数的公式: n=2^l-1
(l为二叉树的深度) 先求二叉树的深度,然后二叉树的右孩子的最左结点的深度,进行if判断:
如果与二叉树深度相同,那么该二叉树的左孩子表示的二叉树为满二叉树;
如果与二叉树深度不同,那么该二叉树的右孩子表示的二叉树为满二叉树。
package com.bingo.tree;
/**
* 已知一棵完全二叉树,求其结点个数。
* 要求:时间复杂度低于O(N),N为这棵树的结点个数
*
* @author ylb
*
*/
public class CompleteTreeNodeNumber {
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int data) {
this.value = data;
}
}
/**
* 主函数,求结点个数nodeNum
* @param head
* @return
*/
public static int nodeNum(Node head) {
if (head == null) {
return 0;
}
return bs(head, 1, mostLeftLevel(head, 1));
}
/**
*
* @param node 当前结点
* @param level 当前结点所在的层
* @param h 树的深度
* @return node结点表示的树的结点个数
*/
public static int bs(Node node, int level, int h) {
if (level == h) {
// level == h,表示结点所在的层与树的深度相等,说明结点为叶结点
// 返回结点表示的树的结点数1
return 1;
}
if (mostLeftLevel(node.right, level + 1) == h) {
// 结点的右孩子的最左结点深度与树的深度相等,说明结点的左孩子表示的树为满二叉树
return (1 << (h - level)) + bs(node.right, level + 1, h);
} else {
// 结点的右孩子的最左结点深度与树的深度不等,说明结点的右孩子表示的树为满二叉树
return (1 << (h - level - 1)) + bs(node.left, level + 1, h);
}
}
/**
*
* @param node 当前结点
* @param level 当前结点所在的层
* @return 当前结点表示的树的深度
*/
public static int mostLeftLevel(Node node, int level) {
while (node != null) {
++level;
node = node.left;
}
return level - 1;
}
}
以上是关于算法题0009 | 求完全二叉树结点个数的主要内容,如果未能解决你的问题,请参考以下文章