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
三、总结
- 注意完全二叉树的特性。
- 再次熟悉了递归法,仍然感觉有点绕。
部分内容参考代码随想录