给出一个完全二叉树,求出该树的节点个数。
说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例:
输入:
1
/
2 3
/ /
4 5 6输出: 6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-complete-tree-nodes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
使用递归:
时间复杂度、空间复杂度都O(n)
class Solution { int number = 0; public int countNodes(TreeNode root) { if(root == null){ return number; } dfs(root); return number; } public void dfs(TreeNode root){ if(root == null){ return; } number++; dfs(root.left); dfs(root.right); } }
但并没有使用完全二叉树的特点
public int countNodes(TreeNode root) { //如何利用完全二叉树的特点 //首先算出来当前二叉树的高度 int tree = treeHeight(root); if(tree == 0 || tree == 1){ //如果树的高度是 0 或者1 则直接返回 return tree; } //再计算出右子树的高度 int rightTree = treeHeight(root.right); //如果右子树的高度和整个树的高度 -2 相等,那么说明,这棵树的右子树为满二叉树 if(rightTree == tree - 2){ //那么这个二叉树的右子树的节点个数就是固定的 //那么只需要关心左子树的节点的个数了 return (1 << rightTree) + countNodes(root.left); } else { //如果右子树的个数是 整个树的高度 -1 相等,那么说明,这个树的左子树是满二叉树 //那么就只需要关心右子树的节点的个数了 return (1 << (tree - 1)) + countNodes(root.right); } }
参考:https://leetcode-cn.com/problems/count-complete-tree-nodes/solution/javadai-ma-tu-wen-xiang-jie-ji-bai-liao-100de-yong/