算法通关村第七关-递归:迭代实现二叉树的遍历

理论上,递归能做的迭代一定能做,但可能会比较复杂。
我们用迭代法实现下二叉树的前中后序遍历

一、迭代法实现前序遍历

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值