[toc]
题目介绍
题目链接
https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
题目考点
二叉树中序遍历,递归,迭代,栈
题目难度
LeetCode Medium
题目大意
二叉树中序遍历(左中右)
输入
1个二叉树
输出
该二叉树中序遍历的结果
题解一
解题思路
递归法
先通过递归遍历当前根结点的左子树,然后遍历当前的根结点,然后通过递归遍历当前根结点的右子树。
复杂度分析
假设该二叉树有n个结点,则时间复杂度为$O(n)$、最大空间复杂度为$O(n)$、平均空间复杂度为$O(log\ n)$。
代码
1 | class Solution { |
题解二
解题思路
迭代法/栈法
通过显式栈模拟递归函数。该思路仅需要微小改动就可以通用于二叉树的先/中/后序遍历。该思路实现3种顺序遍历的介绍:https://www.cnblogs.com/chouxianyu/p/13293284.html
该思路的核心是将
nullptr
作为可以遍历下1个结点的标志(因此也就不能将空结点压入栈中),即遇到nullptr
时就可以遍历下一个结点,如果不是nullptr
则根据遍历顺序入栈,当前根结点入栈时也要将nullptr
压入栈中(后续遇到这个nullptr
时就可以遍历到该根结点)。复杂度分析
假设二叉树有n个结点,则时间复杂度为$O(n)$、最大空间复杂度为$O(n)$、平均空间复杂度为$O(log\ n)$。
代码
1 | class Solution { |
题解三
解题思路
栈法/迭代法
中序遍历的顺序为:左子树、根结点、右子树。
对于1个根结点
root
,分3步操作:将
root
压入栈中并不断更新为其左子树,直至root
为空可以想象下,中序遍历时就是这样并不遍历当前结点,而是一直往左下角延伸到底
更新
root
为栈顶结点并遍历它(第1步结束后,此时栈顶结点无左子树或其左子树已遍历完)更新
root
为其右子树通过循环遍历其右子树如果
root
非空或者栈非空则循环以上步骤
复杂度分析
假设二叉树有n个结点,则时间复杂度为$O(n)$、最大空间复杂度为$O(n)$、平均空间复杂度为$O(log\ n)$。
代码
1 | class Solution { |
题解四
Morris 遍历算法是另一种遍历二叉树的方法。
假设二叉树有n个结点,该算法的时间复杂度为$O(n)$、空间复杂度为$O(1)$。
作者:@臭咸鱼
转载请注明出处:https://www.cnblogs.com/chouxianyu/
欢迎讨论和交流!