这里都用递归的方法解决
递归和迭代的区别
递归和迭代是编程中两种基本的控制结构,都是为了重复执行某段代码,但是它们之间存在一些基本的区别。
-
定义:
-
递归:递归是一种算法,其中一个函数通过在其自身内部调用自身来工作。它会不断重复相同或相似的任务,直到达到设定的条件。在递归中,函数调用自己,直到达到基本条件(也称为递归终止条件)。
-
迭代:迭代是一种算法,该算法在程序设计中重复一系列指令,直到满足特定的条件。通常,这些指令被封装在一个称为 "循环" 的结构中(如for循环,while循环等)。在迭代中,一段代码(通常是一个循环)会反复执行,直到某个特定条件被满足。
-
-
存储:在递归中,系统必须维护所有递归调用的堆栈,这需要更多的内存。在迭代中,内存的使用通常会更少,因为不需要维护这样的堆栈。
-
性能:由于需要堆栈操作和函数调用操作,递归通常比迭代慢。然而,递归可以提供更简洁,更容易理解的代码,尤其是对于一些复杂的问题,如树或图的遍历。
-
终止条件:在递归中,我们有一个基本条件来停止递归。在迭代中,我们有一个条件来停止循环。
递归和迭代都有各自的优点和适用场景。递归的优点在于代码通常更为简洁,逻辑更清晰,更容易理解,而迭代的优点在于它通常效率更高,占用资源更少。
222. 完全二叉树的节点个数
给你一棵 完全二叉树 的根节点
root
,求出该树的节点个数。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第
h
层,则该层包含1~ 2h
个节点。示例 1:
输入:root = [1,2,3,4,5,6] 输出:6示例 2:
输入:root = [] 输出:0示例 3:
输入:root = [1] 输出:1提示:
- 树中节点的数目范围是
[0, 5 * 104]
0 <= Node.val <= 5 * 104
- 题目数据保证输入的树是 完全二叉树
进阶:遍历树来统计节点是一种时间复杂度为
O(n)
的简单解决方案。你可以设计一个更快的算法吗?
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def countNodes(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if not root:
return 0
queue = collections.deque([root])
result = 0
while queue:
level_size = len(queue)
for i in range(level_size):
node = queue.popleft()
result += 1
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return result