编写先序、中序、后序遍历二叉树的算法代码
时间: 2023-10-17 12:17:59 浏览: 37
二叉树的遍历方式有三种:先序遍历、中序遍历和后序遍历。
先序遍历的顺序是先遍历根节点,然后遍历左子树,最后遍历右子树。
中序遍历的顺序是先遍历左子树,然后遍历根节点,最后遍历右子树。
后序遍历的顺序是先遍历左子树,然后遍历右子树,最后遍历根节点。
以下是对应的算法代码:
先序遍历二叉树:
```python
# 先序遍历二叉树
def preorder(root):
if root:
print(root.val)
preorder(root.left)
preorder(root.right)
```
中序遍历二叉树:
```python
# 中序遍历二叉树
def inorder(root):
if root:
inorder(root.left)
print(root.val)
inorder(root.right)
```
后序遍历二叉树:
```python
# 后序遍历二叉树
def postorder(root):
if root:
postorder(root.left)
postorder(root.right)
print(root.val)
```
其中,root 表示二叉树的根节点,left 表示左子树,right 表示右子树。上述代码中,我们使用了递归的方式来遍历二叉树。
相关问题
编写创建二叉树然后先序、中序、后序遍历二叉树的算法完整代码
以下是创建二叉树并进行先序、中序、后序遍历的 Python 代码:
```python
# 定义二叉树节点
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
# 创建二叉树
def buildTree(preorder, inorder):
if not preorder:
return None
root = TreeNode(preorder[0])
index = inorder.index(preorder[0])
root.left = buildTree(preorder[1:index+1], inorder[:index])
root.right = buildTree(preorder[index+1:], inorder[index+1:])
return root
# 先序遍历
def preorderTraversal(root):
if not root:
return []
return [root.val] + preorderTraversal(root.left) + preorderTraversal(root.right)
# 中序遍历
def inorderTraversal(root):
if not root:
return []
return inorderTraversal(root.left) + [root.val] + inorderTraversal(root.right)
# 后序遍历
def postorderTraversal(root):
if not root:
return []
return postorderTraversal(root.left) + postorderTraversal(root.right) + [root.val]
# 测试样例
preorder = [1,2,4,5,3,6,7]
inorder = [4,2,5,1,6,3,7]
root = buildTree(preorder, inorder)
print(preorderTraversal(root)) # [1, 2, 4, 5, 3, 6, 7]
print(inorderTraversal(root)) # [4, 2, 5, 1, 6, 3, 7]
print(postorderTraversal(root)) # [4, 5, 2, 6, 7, 3, 1]
```
其中,先序遍历、中序遍历、后序遍历的递归实现都比较简单,主要是在创建二叉树的过程中需要注意细节。在创建二叉树时,先序遍历的第一个元素是根节点,可以根据该元素在中序遍历中的位置,将中序遍历分为左子树和右子树部分,然后递归地创建左子树和右子树。
编写递归实现二叉树的中序、先序和后序遍历算法。函数名分别为 inorder, preorder, postorder.
以下是递归实现二叉树的中序、先序和后序遍历算法的 Python 代码:
```python
# 定义二叉树结点类
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
# 中序遍历
def inorder(root):
if root is None:
return
inorder(root.left)
print(root.val)
inorder(root.right)
# 先序遍历
def preorder(root):
if root is None:
return
print(root.val)
preorder(root.left)
preorder(root.right)
# 后序遍历
def postorder(root):
if root is None:
return
postorder(root.left)
postorder(root.right)
print(root.val)
```
其中,二叉树结点类定义了三个属性:`val` 表示结点的值,`left` 表示左子结点,`right` 表示右子结点。三个遍历函数都采用递归实现。在中序遍历中,先遍历左子树,再输出当前结点的值,最后遍历右子树;在先序遍历中,先输出当前结点的值,再遍历左子树和右子树;在后序遍历中,先遍历左子树和右子树,最后输出当前结点的值。