题目链接:https://leetcode-cn.com/problems/count-complete-tree-nodes/
难度:中等

描述:
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含222. 完全二叉树的节点个数 - 图1个节点。

题解

  1. 直接遍历二叉树的所有结点

    1. # Definition for a binary tree node.
    2. # class TreeNode:
    3. # def __init__(self, val=0, left=None, right=None):
    4. # self.val = val
    5. # self.left = left
    6. # self.right = right
    7. class Solution:
    8. def countNodes(self, root: TreeNode) -> int:
    9. ret = []
    10. def dfs(root):
    11. ret.append(0)
    12. if root.left:
    13. dfs(root.left)
    14. if root.right:
    15. dfs(root.right)
    16. if root is None:
    17. return 0
    18. dfs(root)
    19. return len(ret)
    20. # 还可以优化
  2. 比较左右子树的高度

    1. # Definition for a binary tree node.
    2. # class TreeNode:
    3. # def __init__(self, val=0, left=None, right=None):
    4. # self.val = val
    5. # self.left = left
    6. # self.right = right
    7. class Solution:
    8. def countNodes(self, root: TreeNode) -> int:
    9. def get_height(root):
    10. height = 0
    11. while root:
    12. height += 1
    13. root = root.left
    14. return height
    15. ret = 0
    16. while root:
    17. left_height = get_height(root.left)
    18. right_height = get_height(root.right)
    19. # 高度相同说明左子树是满的,加上左子树的节点数目再加1(root节点)
    20. if left_height == right_height:
    21. ret += 2 ** left_height
    22. root = root.right
    23. else: # 说明右子树是满的,加上右子树的节点数目再加1(root节点)
    24. ret += 2 ** right_height
    25. root = root.left
    26. return ret