建立以左右孩 子链接结构表示的二叉树,实现二叉树的先序、中序、后续的递归和非递归方式遍历,分层遍历、统计树的高度,并给出完整python代码
时间: 2024-12-15 16:14:09 浏览: 14
建立以左孩子右孩子的链接结构表示的二叉树,我们通常会使用节点类来存储每个元素及其对应的左右子节点。对于二叉树的遍历有多种方法:
1. **递归方式遍历**:
- 先序遍历(根-左-右): 对当前节点执行操作,然后对左子树和右子树分别递归调用。
```python
def preorder_traversal(root):
if root is not None:
print(root.val) # 打印节点值
preorder_traversal(root.left)
preorder_traversal(root.right)
```
- 中序遍历(左-根-右): 首先对左子树递归,接着访问当前节点,最后右子树。
```python
def inorder_traversal(root):
if root is not None:
inorder_traversal(root.left)
print(root.val)
inorder_traversal(root.right)
```
- 后序遍历(左-右-根): 对左子树和右子树先递归,最后访问根节点。
```python
def postorder_traversal(root):
if root is not None:
postorder_traversal(root.left)
postorder_traversal(root.right)
print(root.val)
```
2. **非递归方式遍历**:
可以使用栈数据结构辅助完成,比如先序遍历可以借助栈保存待访问节点。
3. **层次遍历(广度优先搜索,BFS)**:
使用队列实现,按照从上到下、从左到右的顺序逐层访问。
```python
from collections import deque
def level_order_traversal(root):
if not root:
return []
queue = deque([root])
result = []
while queue:
level_nodes = [node.val for node in queue]
result.append(level_nodes)
queue = deque([child for node in level_nodes for child in (node.left, node.right) if child])
return result
```
4. **计算树的高度**:
树的高度可通过递归或迭代的方式求解,递归法比较简单,利用`height(root)`等于`max(height(left), height(right)) + 1`。
```python
def height(root):
if not root:
return 0
else:
left_height = height(root.left)
right_height = height(root.right)
return max(left_height, right_height) + 1
```
上述代码假设二叉树节点的结构如下:
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
```
阅读全文