二叉树的深度优先遍历可以分为先序、中序、后序遍历,请说明先序、中序、后序是如何遍历一棵二叉树的,请举例一颗二叉树,并给出后序遍历非递归的思想与实现代码。
时间: 2023-07-10 21:03:14 浏览: 77
二叉树的深度优先遍历可以分为先序、中序、后序遍历:
1. 先序遍历:先访问根节点,再访问左子树,最后访问右子树。
2. 中序遍历:先访问左子树,再访问根节点,最后访问右子树。
3. 后序遍历:先访问左子树,再访问右子树,最后访问根节点。
举例一颗二叉树:
```
1
/ \
2 3
/ \ / \
4 5 6 7
```
先序遍历结果为:1 2 4 5 3 6 7
中序遍历结果为:4 2 5 1 6 3 7
后序遍历结果为:4 5 2 6 7 3 1
后序遍历非递归的思想是利用栈,将根节点入栈,然后遍历左子树,将左子树入栈,直到左子树为空。此时从栈顶取出一个节点,判断其是否有右子树,如果有则遍历右子树并将其入栈,如果没有则访问该节点。重复上述过程直到栈为空。
实现代码如下:
```python
def postorderTraversal(root):
if not root:
return []
stack, res = [(root, False)], []
while stack:
node, visited = stack.pop()
if visited:
res.append(node.val)
else:
stack.append((node, True))
if node.right:
stack.append((node.right, False))
if node.left:
stack.append((node.left, False))
return res
```
其中,stack 中存储的是元组,第一个元素是节点,第二个元素表示该节点是否已经被访问过。当 visited 为 True 时表示该节点已经被访问过,因此可以将其加入结果数组中。当 visited 为 False 时表示该节点尚未被访问过,因此需要将其右子树、左子树依次入栈。
阅读全文