一、题目说明
给出一个完全二叉树,求出该树的节点个数。
说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例:
输入:
1
/
2 3
/ \ /
4 5 6
输出: 6
二、Python代码实现
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def countNodes(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if root == None:
return 0
else:
return self.countNodes(root.left) + self.countNodes(root.right) + 1
或者直接缩短为一行代码,也可以直接求解:
return 0 if root == None else self.countNodes(root.left) + self.countNodes(root.right) + 1
三、Java代码实现
Java代码实现是参考评论区同学的答案。
class Solution {
public int countNodes(TreeNode root) {
/**
完全二叉树的高度可以直接通过不断地访问左子树就可以获取
判断左右子树的高度:
如果相等说明左子树是满二叉树, 然后进一步判断右子树的节点数(最后一层最后出现的节点必然在右子树中)
如果不等说明右子树是深度小于左子树的满二叉树, 然后进一步判断左子树的节点数(最后一层最后出现的节点必然在左子树中)
**/
if (root==null) return 0;
int ld = getDepth(root.left);
int rd = getDepth(root.right);
if(ld == rd) return (1 << ld) + countNodes(root.right); // 1(根节点) + (1 << ld)-1(左完全左子树节点数) + 右子树节点数量
else return (1 << rd) + countNodes(root.left); // 1(根节点) + (1 << rd)-1(右完全右子树节点数) + 左子树节点数量
}
private int getDepth(TreeNode r) {
int depth = 0;
while(r != null) {
depth++;
r = r.left;
}
return depth;
}
}
四、算法分析
(1) Python代码分析
节点数=左子树节点 + root节点(=1) + 递归找右子树。
(2) Java代码算法分析
从下图中,可以看出java实现比python快很多,当然很多的时候。C/C++比java快,所以开发的话,还是推荐C/C++ 或者java
参考文献:
[1] https://leetcode-cn.com/problems/count-complete-tree-nodes/
[2] https://leetcode-cn.com/problems/count-complete-tree-nodes/comments/