已知二叉树采用二叉链表存储结构,指向根节点存储地址的指针为t。试编写一算法,判断二叉树是否为完全二叉树
时间: 2024-06-12 14:04:35 浏览: 113
erchashubianli.rar_用二叉链表 进行 二叉树 遍历
算法思路:
1. 如果二叉树为空,则是完全二叉树。
2. 如果二叉树不为空,从根节点开始,按照层序遍历的顺序逐个访问节点。
3. 对于每个访问到的节点,如果它有右子节点但没有左子节点,则不是完全二叉树。
4. 如果遍历到了一个节点,它没有左子节点也没有右子节点,则后面的所有节点都必须是叶子节点,否则不是完全二叉树。
5. 如果遍历完所有节点都满足上述条件,则是完全二叉树。
算法实现:
```python
def is_complete_binary_tree(root):
if root is None:
return True
queue = [root]
leaf_node_seen = False
while len(queue) > 0:
node = queue.pop(0)
if node.left is not None:
if leaf_node_seen:
return False
queue.append(node.left)
else:
leaf_node_seen = True
if node.right is not None:
if leaf_node_seen:
return False
queue.append(node.right)
else:
leaf_node_seen = True
return True
```
算法解析:
1. 初始化队列,将根节点加入队列中。
2. 循环访问队列中的节点,如果节点有左子节点,将左子节点加入队列中;如果节点有右子节点,将右子节点加入队列中。
3. 如果访问到的节点没有左子节点也没有右子节点,则后面的所有节点都必须是叶子节点,否则不是完全二叉树。
4. 如果遍历完所有节点都满足上述条件,则是完全二叉树。
算法复杂度:
时间复杂度:O(n),其中 n 是二叉树的节点数。需要遍历所有节点,时间复杂度为 O(n)。
空间复杂度:O(n),其中 n 是二叉树的节点数。最坏情况下,队列中需要存储所有节点,空间复杂度为 O(n)。
阅读全文