解法一: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 =
0def
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 =
0def
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
LeetCode 222 完全二叉樹的節點個數
給出乙個完全二叉樹,求出該樹的節點個數。說明 完全二叉樹的定義如下 在完全二叉樹中,除了最底層節點可能沒填滿外,其餘每層節點數都達到最大值,並且最下面一層的節點都集中在該層最左邊的若干位置。若最底層為第 h 層,則該層包含 1 2h 個節點。示例 輸入 1 2 3 4 5 6 輸出 6方法一 def...
Leetcode 222 完全二叉樹的節點個數
給出乙個完全二叉樹,求出該樹的節點個數。說明 完全二叉樹的定義如下 在完全二叉樹中,除了最底層節點可能沒填滿外,其餘每層節點數都達到最大值,並且最下面一層的節點都集中在該層最左邊的若干位置。若最底層為第 h 層,則該層包含 1 2h 個節點。示例 輸入 1 2 3 4 5 6輸出 6 解題思路 二分...
Leetcode 222 完全二叉樹的節點個數
給出乙個完全二叉樹,求出該樹的節點個數。說明 完全二叉樹 的定義如下 在完全二叉樹中,除了最底層節點可能沒填滿外,其餘每層節點數都達到最大值,並且最下面一層的節點都集中在該層最左邊的若干位置。若最底層為第 h 層,則該層包含 1 2h 個節點。示例 輸入 輸出 6 1 public class so...