输入字符序列,建立二叉树;按先序、中序、后序遍历二叉树(三种递归算法和中序遍历的非递归算法);
时间: 2024-05-11 12:18:38 浏览: 129
二叉树的几种操作,包括递归先序建立二叉树、先序遍历、中序遍历、后序遍历、非递归的各种遍历
好的,让我来为您解答。
首先,我们需要了解二叉树的定义和遍历方式。
二叉树是一种每个节点最多有两个子节点的树结构。每个节点包含一个值和指向左右子节点的指针。遍历二叉树的方式有三种:
1. 先序遍历:先遍历根节点,然后遍历左子树,最后遍历右子树。
2. 中序遍历:先遍历左子树,然后遍历根节点,最后遍历右子树。
3. 后序遍历:先遍历左子树,然后遍历右子树,最后遍历根节点。
下面是基于输入字符序列建立二叉树,并实现遍历的 Python 代码示例:
```python
class Node:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def buildTree(preorder, inorder):
if not preorder or not inorder:
return None
# 取先序遍历的第一个元素为根节点
root = Node(preorder.pop(0))
# 根据根节点在中序遍历中的位置分割左右子树
index = inorder.index(root.val)
root.left = buildTree(preorder, inorder[:index])
root.right = buildTree(preorder, 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]
def inorderTraversalIterative(root):
stack, res = [], []
while stack or root:
while root:
stack.append(root)
root = root.left
root = stack.pop()
res.append(root.val)
root = root.right
return res
preorder = [1, 2, 4, 5, 3, 6, 7]
inorder = [4, 2, 5, 1, 6, 3, 7]
root = buildTree(preorder, inorder)
print('先序遍历:', preorderTraversal(root))
print('中序遍历:', inorderTraversal(root))
print('后序遍历:', postorderTraversal(root))
print('中序遍历(非递归):', inorderTraversalIterative(root))
```
输出结果为:
```
先序遍历: [1, 2, 4, 5, 3, 6, 7]
中序遍历: [4, 2, 5, 1, 6, 3, 7]
后序遍历: [4, 5, 2, 6, 7, 3, 1]
中序遍历(非递归): [4, 2, 5, 1, 6, 3, 7]
```
上述代码中,我们先定义了一个节点类 `Node`,包含值和左右子节点的指针。然后,我们定义了一个函数 `buildTree`,用于根据先序遍历和中序遍历的结果建立二叉树。在这个函数中,我们先取出先序遍历的第一个元素作为根节点,然后在中序遍历中找到根节点的位置,并根据这个位置把左右子树分割开来。然后递归地建立左右子树。最后返回根节点。
接下来,我们定义了三个递归函数 `preorderTraversal`、`inorderTraversal` 和 `postorderTraversal`,分别实现先序、中序、后序遍历。这些函数都是基于递归实现的。
最后,我们定义了一个非递归函数 `inorderTraversalIterative`,实现中序遍历。这个函数使用了一个栈来模拟递归的过程,从而实现非递归遍历。
希望这个示例代码可以帮助您理解二叉树的建立和遍历。
阅读全文