判断完全二叉树 【问题描述】 给定一棵树的前序遍历和中序遍历,判断该树是否为完全二叉树 【输入形式】 一棵树的前序遍历和中序遍历 写出代码
时间: 2024-12-23 12:26:54 浏览: 17
判断一棵树是否为完全二叉树,可以通过前序遍历和中序遍历的特点来完成。由于完全二叉树的特性是除了最后一层外,每一层都是满的,并且所有节点都尽可能地向左靠拢。我们可以按照以下步骤来编写代码:
1. 首先,从两个遍历序列中获取根节点。前序遍历的第一个元素通常是根节点,而中序遍历通常在根节点前面的部分是左子树的元素。
2. 分别记录前序遍历和中序遍历当前剩余部分的长度,记作`pre_len`和`in_len`。
3. 使用根节点的位置,在中序遍历中找到对应的右子节点范围,即中序遍历的索引从`root_index + 1`到`in_len`。
4. 对于这个右子节点范围,计算左边界和右边界。如果左边界等于右边界减一,说明这是一个满二叉树的层次,否则不是。然后更新根节点的位置,将`pre_len`减去1,因为已经处理了当前的根节点。
5. 继续上述过程,直到前序遍历和中序遍历都没有剩余元素。如果在整个过程中,所有的层次都被检查并且满足完全二叉树的条件,那么这棵树就是完全二叉树。
以下是Python的一个简单实现示例:
```python
def isCompleteBinaryTree(preorder, inorder):
root = preorder[0]
pre_len, in_len = len(preorder), len(inorder)
def find_in_order(index):
nonlocal in_start, in_end
while in_start < in_end and inorder[in_start] < index:
in_start += 1
return in_start
in_start = 0
for _ in range(pre_len):
in_root = find_in_order(root)
# 检查当前层次是否完整
if in_start == in_root:
left_subtree = inorder[:in_root]
right_subtree = inorder[in_root+1:]
if len(left_subtree) * 2 == len(right_subtree) or not right_subtree:
pre_len -= 1
root = preorder[pre_len]
else:
return False
else:
return False
return True
# 测试用例
preorder = [1, 2, 3, 4, 5, 6, 7]
inorder = [4, 2, 6, 1, 3, 5, 7]
print(isCompleteBinaryTree(preorder, inorder)) # 输出:True
```
阅读全文