解法一:dfs暴力求解
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def countNodes(self, root: TreeNode) -> int:
self.result = 0
def dfs(node):
if not node:
return
self.result += 1
dfs(node.left)
dfs(node.right)
dfs(root)
return self.result
解法二:二分
核心思路:完全二叉树中,左子树和右子树中至少有一颗完美的完全二叉树(可以简单思考一下)
在这个思路下,每次检测左右节点的最左路径,如果相等,说明右子树可能不完美,若不相等,则左子树一定不完美,此算法可实现O(log^2N)的复杂度
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def countNodes(self, root: TreeNode) -> int:
self.result = 0
def dive(node):
if not node:
return
h1, h2 = 0, 0
n1, n2 = node.left, node.right
while n1:
h1 += 1
n1 = n1.left
while n2:
h2 += 1
n2 = n2.left
if h1 == h2:
# 右子树可能不完美
self.result += (1 << h1)
dive(node.right)
else:
# 左子树不完美
self.result += (1 << h2)
dive(node.left)
dive(root)
return self.result