根据给定的二叉树,先人工对其进行先序遍历,根据先序遍历的结果编写程序创建该二叉树;然后用非递归中序遍历算法,输出中序遍历的结果。
时间: 2023-07-22 13:18:39 浏览: 85
好的,我来解答这个问题。
首先,我们需要了解二叉树的先序遍历和中序遍历算法。
先序遍历:先访问根节点,然后访问左子树,最后访问右子树。
中序遍历:先访问左子树,然后访问根节点,最后访问右子树。
根据先序遍历的结果创建二叉树的算法如下:
1. 如果输入列表为空,返回 None。
2. 取出输入列表的第一个元素作为当前节点的值。
3. 构造当前节点。
4. 递归创建左子树:将输入列表中除第一个元素外的部分作为左子树的先序遍历结果,然后递归调用创建二叉树的函数。
5. 递归创建右子树:将输入列表中除第一个元素和左子树的先序遍历结果外的部分作为右子树的先序遍历结果,然后递归调用创建二叉树的函数。
6. 返回当前节点。
实现代码如下:
```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):
if not preorder:
return None
val = preorder[0]
node = TreeNode(val)
i = 1
while i < len(preorder) and preorder[i] < val:
i += 1
node.left = build_tree(preorder[1:i])
node.right = build_tree(preorder[i:])
return node
```
接下来,我们使用非递归中序遍历算法输出中序遍历的结果。
中序遍历的非递归算法使用栈来实现。
1. 初始化栈和当前节点为根节点。
2. 将当前节点及其左子树依次入栈,直到当前节点为空。
3. 弹出栈顶节点,输出其值。
4. 将当前节点设置为弹出节点的右子节点。
5. 重复步骤 2-4,直到栈为空。
实现代码如下:
```python
def inorder_traversal(root):
stack = []
node = root
res = []
while node or stack:
while node:
stack.append(node)
node = node.left
node = stack.pop()
res.append(node.val)
node = node.right
return res
```
完整代码如下:
```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):
if not preorder:
return None
val = preorder[0]
node = TreeNode(val)
i = 1
while i < len(preorder) and preorder[i] < val:
i += 1
node.left = build_tree(preorder[1:i])
node.right = build_tree(preorder[i:])
return node
def inorder_traversal(root):
stack = []
node = root
res = []
while node or stack:
while node:
stack.append(node)
node = node.left
node = stack.pop()
res.append(node.val)
node = node.right
return res
# 测试样例
preorder = [5, 3, 1, 4, 7, 6, 8]
root = build_tree(preorder)
print(inorder_traversal(root)) # 输出 [1, 3, 4, 5, 6, 7, 8]
```
希望能帮到你!
阅读全文