建立二叉树,并实现二叉树的遍历,先序遍历采用递归算法实现,层次遍历用非递归算法来实现。每一句代码都需要详细解释
时间: 2024-03-09 16:47:27 浏览: 82
先序遍历的非递归算法
好的,我来为您详细解释每一句代码。
首先,我们需要了解二叉树的基本概念。二叉树是由节点组成的树形结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树有三种基本遍历方式:
- 先序遍历:先访问根节点,然后访问左子树,最后访问右子树。
- 中序遍历:先访问左子树,然后访问根节点,最后访问右子树。
- 后序遍历:先访问左子树,然后访问右子树,最后访问根节点。
现在我们来看一下如何建立二叉树和实现二叉树的先序遍历和层次遍历。
1. 建立二叉树
我们可以通过递归的方式来建立二叉树。具体实现如下:
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def build_tree(preorder, inorder):
if not preorder or not inorder:
return None
root_val = preorder.pop(0)
root_index = inorder.index(root_val)
root = TreeNode(root_val)
root.left = build_tree(preorder, inorder[:root_index])
root.right = build_tree(preorder, inorder[root_index+1:])
return root
```
这里我们定义了一个`TreeNode`类来表示二叉树的节点。`build_tree`函数通过递归的方式建立二叉树。具体过程如下:
- 如果先序遍历结果或中序遍历结果为空,则返回`None`。
- 先序遍历的第一个元素是根节点,我们取出它的值,并从先序遍历结果中删除该元素。
- 在中序遍历结果中找到根节点的位置,这样就可以确定左子树和右子树的节点个数。
- 通过递归的方式分别构建左子树和右子树,然后将它们连接到根节点上。
- 最后返回根节点。
2. 实现先序遍历
二叉树的先序遍历可以采用递归算法实现,具体实现如下:
```python
def preorder_traversal(root):
if not root:
return []
res = [root.val]
res += preorder_traversal(root.left)
res += preorder_traversal(root.right)
return res
```
这里我们定义了一个`preorder_traversal`函数来实现先序遍历。具体过程如下:
- 如果根节点为空,则返回空列表。
- 先访问根节点,并将其值加入结果列表中。
- 递归访问左子树和右子树,并将它们的结果合并起来。
3. 实现层次遍历
二叉树的层次遍历可以采用队列的方式实现,具体实现如下:
```python
from collections import deque
def level_traversal(root):
if not root:
return []
res = []
queue = deque([root])
while queue:
level_size = len(queue)
level_res = []
for i in range(level_size):
node = queue.popleft()
level_res.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
res.append(level_res)
return res
```
这里我们定义了一个`level_traversal`函数来实现层次遍历。具体过程如下:
- 如果根节点为空,则返回空列表。
- 定义一个空列表`res`来存储结果。
- 定义一个队列`queue`来存储需要遍历的节点,初始时将根节点入队。
- 循环遍历队列中的节点,每次取出队列中的所有节点,将它们的值存储到一个列表`level_res`中,并将它们的左右子节点入队。
- 将每一层的节点值存储到一个列表中,并将该列表存储到结果列表中。
- 最后返回结果列表。
以上就是建立二叉树,并实现二叉树的遍历的方法,希望对您有所帮助。
阅读全文