二叉树的深度优先遍历可以分为先序、中序、后序遍历,请说明先序、中序、后序是如何遍历一棵二叉树的,请举例一颗二叉树,并给出后序遍历非递归的思想与实现代码。
时间: 2023-10-23 07:16:16 浏览: 184
二叉树先序、中序、后序遍历(递归、非递归算法)
4星 · 用户满意度95%
二叉树的深度优先遍历包括先序遍历、中序遍历和后序遍历。其中,先序遍历的遍历顺序为先遍历根节点,再遍历左子树,最后遍历右子树;中序遍历的遍历顺序为先遍历左子树,再遍历根节点,最后遍历右子树;后序遍历的遍历顺序为先遍历左子树,再遍历右子树,最后遍历根节点。下面以一颗二叉树为例进行说明。
```
1
/ \
2 3
/ \ \
4 5 6
```
先序遍历:1 2 4 5 3 6
中序遍历:4 2 5 1 3 6
后序遍历:4 5 2 6 3 1
下面给出后序遍历的非递归实现代码:
```python
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def postorderTraversal(root: TreeNode) -> List[int]:
if not root:
return []
stack1, stack2 = [root], []
while stack1:
node = stack1.pop()
stack2.append(node)
if node.left:
stack1.append(node.left)
if node.right:
stack1.append(node.right)
res = []
while stack2:
res.append(stack2.pop().val)
return res
```
该算法使用了两个栈,第一个栈用于存储待处理节点,第二个栈用于存储已经处理过的节点。首先将根节点压入第一个栈中,然后对于每个弹出的节点,将其压入第二个栈中,并按照右子树、左子树的顺序依次将其左右子节点压入第一个栈中。最后,将第二个栈中的节点依次弹出并记录其值,即为后序遍历的结果。
阅读全文