Leetcode94-二叉树的中序遍历详解

  往期博客:

Leetcode1-两数之和详解

Leetcode2-两数相加代码详解

Leetcode20-有效的括号详解

Leetcode21-合并两个有序链表详解

Leetcode22-有效括号生成详解

Leetcode24-两两交换链表中的节点详解

Leetcode27-移除元素详解

Leetcode46-全排列详解

Leetcode49-字母异位分组详解

Leetcode53-最大子数组和详解

Leetcode56-合并区间详解

LeetCode57-插入区间详解

Leetcode77-组合详解

Leetcode78-子集详解

Leetcode90-子集II详解


目录

题目

示例

解析

递归法

 迭代法

代码

递归法

迭代法


题目

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

题目分析

已知:二叉树的根节点

目的:中序遍历


示例

示例1

Leetcode94-二叉树的中序遍历详解_第1张图片

输入:root = [1,null,2,3]
输出:[1,3,2]

 示例2

输入:root = []
输出:[]

示例3

输入:root = [1]
输出:[1]

解析

递归法

中序遍历就是按左子树—>根节点—>右子树的顺序遍历二叉树,而对于左右子树同样按同样的方式进行遍历,直到遍历完整棵树。

对于如图所式的二叉树

Leetcode94-二叉树的中序遍历详解_第2张图片

 根节点1有左子树和右子树,根节点2和3同样有左子树和右子树

Leetcode94-二叉树的中序遍历详解_第3张图片

 所以遍历过程为:4—>2—>5—>1—>6—>3—>7

对于递归来说,就是先找整个二叉树最左边的子节点,这个最左边的子节点就是不再有左孩子的节点,对于下图就是节点4,绿色箭头表示递归,节点4没有左右孩子节点,此时就要递归到2节点的位置,遍历2节点的右孩子即5节点,5节点无左右孩子便递归到2节点,由于2节点左右孩子以全部遍历,所以再进行递归到1节点,此时整个二叉树的左子树全部遍历完毕。

Leetcode94-二叉树的中序遍历详解_第4张图片

同理,遍历二叉树的整个右子树

Leetcode94-二叉树的中序遍历详解_第5张图片

 迭代法

迭代法是使用栈先进后出的思想遍历二叉树,首先遍历左子树的所有左孩子,并将左孩子加入栈中,直到最后一个左孩子不再有左右节点为止,此时再从栈中取出节点放入结果集。

具体如图所式,遍历左子树的左孩子,并加入栈中,到4节点时不再有左右节点,此时取出4和2加入结果集,到2节点时存在右孩子,将右孩子5节点加入栈中,5节点不再有左右孩子,将5从栈中取出加入结果集,最后将1取出加入结果集,此时,左子树以全部遍历完。

Leetcode94-二叉树的中序遍历详解_第6张图片

 同理,遍历右子树


代码

递归法

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        result = []
        self.helper(root, result)
        return result
    
    def helper(self, node, result):
        if node is None:
            return

        self.helper(node.left, result)
        result.append(node.val)
        self.helper(node.right, result)

迭代法

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        result = []
        stack = []
        cur = root

        while cur or stack:
            if cur:
                stack.append(cur)
                cur = cur.left
            else:
                cur = stack.pop()
                result.append(cur.val)
                cur = cur.right
        return result

你可能感兴趣的:(力扣算法题-python,数据库,leetcode,python,算法)