【Leetcode笔记】完全二叉树的节点个数

Leetcode原题链接:
完全二叉树的节点个数

一、思路

  • 最基础的方法就是三种遍历方式,均为O(n),未做尝试。
  • 针对完全二叉树,可以观察其特性,如果是完全二叉树,则一直向左和一直向右的深度是相等的,而节点个数是 2^(n-1),利用这一特性可以省略掉完全二叉树中间一大块的遍历过程。
  • 具体实现方法:一直向左计算深度,一直向右计算深度,如果相等则直接计算出当前子树的节点数量,传给父节点;若不相等则分别将当前左右节点送入递归,计算其子树节点数量。

二、代码

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def countNodes(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        left = root.left
        right = root.right
        l_depth = 0
        r_depth = 0

        while(left):
            left = left.left
            l_depth += 1
        while(right):
            right = right.right
            r_depth += 1
        
        if l_depth == r_depth:
            return 2**(l_depth+1) - 1
        l_num = self.countNodes(root.left)
        r_num = self.countNodes(root.right)
        
        return l_num + r_num + 1

三、总结

  • 注意完全二叉树的特性。
  • 再次熟悉了递归法,仍然感觉有点绕。

部分内容参考代码随想录

你可能感兴趣的:(leetcode,笔记,算法)