leetcode 第144题 二叉树的前序遍历, 第94题二叉树的中序遍历, 第145题 二叉树的后序遍历

leetcode 第144题 二叉树的前序遍历, 第94题二叉树的中序遍历, 第145题 二叉树的后序遍历

问题分析

这三道题目都是关于二叉树深度优先遍历的题目,我们在学数据结构时都会接触到这个题目,不过用的都是递归的方法。递归的方法思路简单,代码简洁。但是这三道题要求最好不用递归而用迭代的方法。用迭代法去解递归的题目往往会复杂一点,这里我们可以用栈来模拟递归的过程,从而去解题(栈和递归的本质是一致的,具体可以参考这里。)。
这里我直接使用数组来模拟栈进行操作。

104题 二叉树的前序遍历在这里插入图片描述

先看第一题,第一题是前序遍历,比较简单。以下面的树作为例子。
在这里插入图片描述
先建立一个栈,将头节点入栈。
下面做一个循环判断,如果栈为空说明所有节点已经全部处理完毕,如果不为空,那么进行出栈操作。先对出栈的节点进行判断,如果右节点存在,那么将右节点加入栈,再判断左节点是否存在,存在就入栈。最后将当前节点的值加入返回数组中,到此这一次循环操作已经结束,进行下一次循环。
最后,当栈为空时,返回数组。
在这里插入图片描述

94题 二叉树的中序遍历

在这里插入图片描述
第二题是中序遍历,中序遍历与前序遍历不同的是当前节点在判断左右节点并进行操作后,不立即将节点的值加入返回数组,而是在左子树所有的节点都加入返回数组后再加入。
开始的做法和前序相同,先建立栈,然后将根节点入栈。在栈不为空时,对栈顶节点操作,如果栈右节点不为空,那么将右节点加入当前栈顶节点的下面;如果左节点为空(左子树不存在或者左子树已经全部处理完),那么直接将当前节点的值加入返回数组,并将栈顶节点出栈;如果左节点不为空时,将左节点加入栈顶。此时有一个重要的点,因为当前节点的左节点不为空,说明此节点的值不会立即加入返回数组,即还会存在于栈中,所以最后要将节点的左右节点全部赋值为None。这样,下次再次遇到此节点时,就不会重复的对左右节点进行操作,而是将节点值直接的加入返回数组(开始我这点没有想到,所以提交总是不通过)。
在这里插入图片描述

145题 二叉树的后序遍历

在这里插入图片描述
第三题是后序遍历,后序遍历与前两种遍历不同之处在于,当前节点在判断左右节点并进行操作后,不立即将节点的值加入返回数组,而是在左右子树所有的节点都加入返回数组后再加入。
开始的一系列操作和前面相同,此处不再赘余。
对栈顶的节点先判断左右节点是否同时为空,如果是,那么将节点值加入返回数组,并对栈进行出栈操作;如果不是,判断右节点是否为空,不为空入栈;接着判断左节点是否为空,不为空入栈。同中序一样,如果左右节点有存在的话,在处理完后,最后将当前节点的左右节点全部赋值为None,避免下次重复引入节点。在这里插入图片描述

源码

104题 二叉树的前序遍历

class Solution:

    def preorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        ret = []
        stack = []
        if root:
            stack.append(root)
            while stack:
                node = stack.pop()
                if node.right:
                    stack.append(node.right)
                if node.left:
                    stack.append(node.left)
                ret.append(node.val)
        return ret

94题 二叉树的中序遍历

class Solution:
    def inorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        ret = []
        stack = []
        if root:
            stack.append(root)
            while stack:
                node = stack[-1]
                if node.right:
                    stack.insert(-1, node.right)
                if not node.left:
                    ret.append(node.val)
                    stack.pop()
                else:
                    stack.append(node.left)
                    node.left = None
                    node.right = None
        return ret

145题 二叉树的后序遍历

class Solution:
    def postorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        ret = []
        stack = []
        if root:
            stack.append(root)
            while stack:
                node = stack[-1]
                if not (node.left or node.right):
                    ret.append(node.val)
                    stack.pop()
                    continue
                if node.right:
                    stack.append(node.right)
                if node.left:
                    stack.append(node.left)
                node.right, node.left = None, None
        return ret

谢谢大家,过年回家第一天电脑就坏了,穷乡僻壤的,两天才修好。难受~~

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值