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

  往期博客:

Leetcode1-两数之和详解

Leetcode2-两数相加代码详解

Leetcode20-有效的括号详解

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

Leetcode22-有效括号生成详解

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

Leetcode27-移除元素详解

Leetcode46-全排列详解

Leetcode49-字母异位分组详解

Leetcode53-最大子数组和详解

Leetcode56-合并区间详解

LeetCode57-插入区间详解

Leetcode77-组合详解

Leetcode78-子集详解

Leetcode90-子集II详解


目录

题目

示例

解析

递归法

 迭代法

代码

递归法

迭代法


题目

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

题目分析

已知:二叉树的根节点

目的:中序遍历


示例

示例1

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

 示例2

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

示例3

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

解析

递归法

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

对于如图所式的二叉树

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

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

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

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

 迭代法

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

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

 同理,遍历右子树


代码

递归法

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对称二叉树的先序遍历是从根节点开始,先访问根节点,然后按照先左后右的顺序递归遍历左子和右子。这里引用的方法有三种思路实现先序遍历,其中思路1是最基本的实现方式,通过递归的方式遍历两次来判断是否对称。思路1的方法会导致整体上遍历了这棵两次,但实际上只需要比较到两个遍历节点相遇时即可停止,因为后续的比较结果和前面是完全一致的。所以,对于给定的对称二叉树,先序遍历只需要比较到两个遍历节点相遇时即可停止。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [leetcode:Leetcode的解决方案,用JAVA编写](https://download.csdn.net/download/weixin_42121412/19697315)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [[] 101. 对称二叉树(前序遍历 + 方法优化)](https://blog.csdn.net/m0_38142029/article/details/108089313)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值