二叉树的定义
二叉树是一种树形数据结构,其中每个结点最多有两个子结点,通常称为左子结点和右子结点。二叉树广泛应用于计算机科学中,例如表示文件系统、语法树和搜索树。
度的定义
结点的度是指其子结点的数量。对于二叉树来说,每个结点的度可以为 0、1 或 2。度为 0 的结点称为叶结点,度为 1 的结点称为单子结点,度为 2 的结点称为双子结点。
计算度节点的方法
计算二叉树中度为 k 的结点数量的方法有多种,接下来将详细介绍 12 种不同的方法。
递归法
递归法(遍历法)
```python
def count_degree_nodes(node):
if not node:
return 0
left_count = count_degree_nodes(node.left)
right_count = count_degree_nodes(node.right)
return left_count + right_count + (node.left is not None and node.right is not None)
```
递归法(度相加)
```python
def count_degree_nodes(node):
if not node:
return 0
return node.degree + count_degree_nodes(node.left) + count_degree_nodes(node.right)
```
迭代法
广度优先搜索(BFS)
```python
def count_degree_nodes(root):
if not root:
return 0
queue = [root]
degree_count = 0
while queue:
node = queue.pop(0)
degree_count += (node.left is not None and node.right is not None)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return degree_count
```
深度优先搜索(DFS)
```python
def count_degree_nodes(root):
if not root:
return 0
stack = [root]
degree_count = 0
while stack:
node = stack.pop()
degree_count += (node.left is not None and node.right is not None)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return degree_count
```
二叉树遍历法
先序遍历
```python
def count_degree_nodes(node):
if not node:
return 0
return (node.left is not None and node.right is not None) + count_degree_nodes(node.left) + count_degree_nodes(node.right)
```
中序遍历
```python
def count_degree_nodes(node):
if not node:
return 0
return count_degree_nodes(node.left) + (node.left is not None and node.right is not None) + count_degree_nodes(node.right)
```
后序遍历
```python
def count_degree_nodes(node):
if not node:
return 0
return count_degree_nodes(node.left) + count_degree_nodes(node.right) + (node.left is not None and node.right is not None)
```
其他方法
计算叶子节点数
```python
def count_degree_nodes(root):
if not root:
return 0
return count_leaves(root) - 1
```
计算子树个数
```python
def count_degree_nodes(root):
if not root:
return 0
return count_subtrees(root) - 2
```
使用深度优先搜索(DFS)和哈希表
```python
def count_degree_nodes(root):
if not root:
return 0
stack = [root]
hash_table = {}
degree_count = 0
while stack:
node = stack.pop()
if hash_table.get(node.val, None):
degree_count += (node.left is not None and node.right is not None)
else:
hash_table[node.val] = True
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return degree_count
```