LeetCode 算法题库【94】——二叉树的中序遍历

二叉树的中序遍历

题目描述:

timu

解题思路:
  • 第一种:递归。又是递归,可以发现很多题都可以用到递归的思路…。二叉树的中序遍历,这里不太了解的可以看看这个博客:二叉树遍历,总结了二叉树的所有遍历情况。这道题所说的中序遍历,就是按照这个顺序:左子树—> 根结点 —> 右子树的顺序来遍历的。那么递归就很好写了,我还是设了一个函数TraverseTree来递归,然后还定义了一个数组result来依次保存遍历的数。我们按照刚才所说的遍历顺序,先对左子树,也就是tree.left进行遍历,再保存根节点,再遍历右子树,很容易就可以写出来。
  • 时间复杂度:O(N)
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        result = []
        self.TraverseTree(root, result)
        return result

    def TraverseTree(self, tree, l):
        if tree.left:
            self.TraverseTree(tree.left, l)
        l.append(tree.val)
        if tree.right:
            self.TraverseTree(tree.right, l)

1

  • 第二种:迭代遍历,也叫做堆栈法。思路和上一种也类似,我们定义两个数组resulttemp分别来保存最后要输出的中序遍历数组和当前的数组。通过看代码也很容易理解,这里刚开始遍历的时候,如果二叉树不为空,就会一直往往左子树走,每次都会将当前左子树appendtemp里,这里就类似于把所有左子树压到栈中,最后如果没有左子树了,那么就会将最左的元素,也就是temp的第一个元素pop出来,这个数也就是所求中序遍历的第一个数,然后把这个数加到要输出的result里,这个时候我们就开始从当前这个子结点找右子树,从该右子树的左结点又继续刚才的操作。
  • 时间复杂度:O(N)
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
        
class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        result = []
        temp = []
        while root or temp:
            if root:
                temp.append(root)
                root = root.left
            else:
                root = temp.pop()
                result.append(root.val)
                root = root.right
        return result

2

  • 还有一种莫里斯方法可以看看题解,这里就不分享了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值