理论上,递归能做的迭代一定能做,但可能会比较复杂。
我们用迭代法实现下二叉树的前中后序遍历
一、迭代法实现前序遍历
LeetCode144. 二叉树的前序遍历
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
思路分析
前序遍历是中左右,如果还有左子树就一直向下找。完了之后再返回从最底层逐步向上向右找。
使用一个变量,存储需要后续查找右子树的节点,且后入先出,使用栈数据结构、
代码实现
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
# 方法2:迭代法实现
if not root:
return []
node = root
stack = []
res = []
while node or stack:
while node:
res.append(node.val)
stack.append(node)
node = node.left
node = stack.pop()
node = node.right
return res
二、迭代法实现中序遍历
LeetCode94
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
思路分析
中序遍历是左中右,先访问的是二叉树左子树的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(也就是把节点的数值放进res列表中),需要借助栈用来处理节点上的元素
代码实现
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
# 方法2:迭代法
if not root:
return []
res = []
stack = []
node = root
while stack or node:
while node:
stack.append(node)
node = node.left
node = stack.pop()
res.append(node.val)
node = node.right
return res
三、迭代法实现后序遍历
LeetCode145
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
后序遍历是左右中,后续遍历的非递归实现有三种基本的思路:反转法、访问标记法、Morris法
这里介绍反转法
思路分析
首先观察下
3
/ \
9 4
/ \
5 7
后序遍历:9 5 7 4 3
将后序遍历反转:3 4 7 5 9
观察可以发现,将后续遍历反转过来后,跟前序遍历有点类似,只不过逻辑变成了 中右左,参考前序遍历的实现逻辑改造下,再将结果翻转,就可以获得后序遍历的结果
代码实现
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
# 方法2:迭代法(反转法)
if not root:
return []
res = []
stack = []
while root or stack:
while root:
res.append(root.val)
stack.append(root)
root = root.right
root = stack.pop()
root = root.left
res.reverse()
return res