目录
- 一、题目描述
- 题目
- 中序遍历介绍
- 二、递归实现
- 递归遍历过程
- 实现代码
- 三、迭代实现
- 迭代遍历过程
- 实现代码
一、题目描述
题目
给定一个二叉树的根节点 root ,返回它的 中序 遍历。
示例1:

输入:root = [1,null,2,3]
输出:[1,3,2]示例2:
输入:root = []
输出:[]示例3:
输入:root = [1,null,2]
输出:[1,2]中序遍历介绍

二、递归实现
递归遍历过程
1. 前序遍历其左子树;
2. 访问根节点;
3. 前序遍历其右子树;
然后就是一直递归下去,在访问到节点的时候,可以进行节点的相关处理,比如说简单的访问节点值。
实现代码
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
def inorder(root:TreeNode):
if not root:
return
inorder(root.left)
res.append(root.val)
inorder(root.right)
res = []
inorder(root)
return res复杂度分析
- 时间复杂度:O(
),其中
- 空间复杂度:O(
),为递归过程中栈的开销,平均情况下为 O(
),最坏情况下树呈现链状,为 O(
)。
三、迭代实现
迭代遍历过程
a. 当遍历到一个结点时,就压栈,然后继续去遍历它的左子树;
b. 当左子树遍历完成后,从栈顶弹出栈顶元素(左子树最后一个元素)并访问它;
c. 最后按照当前指正的右孩子继续中序遍历,若没有右孩子,继续弹出栈顶元素。
实现代码
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
res=[]
stack=[]
while stack or root:
while root:
stack.append(root)
root=root.left
if stack:
tmp=stack.pop()
res.append(tmp.val)
root=tmp.right
return res复杂度分析
- 时间复杂度:O(
),其中
- 空间复杂度:O(
),为递归过程中栈的开销,平均情况下为 O(
),最坏情况下树呈现链状,为 O(
)。
中序遍历的非递归过程也是利用了一个「栈」来实现,由于是中序遍历,那么首先要访问左孩子,进而一定要把每个子结构的根结点入栈,然后访问左孩子,弹出栈顶元素(访问根结点),再进行访问右孩子,访问右孩子的时候,继续将每个子结构的根结点入栈,然后访问左孩子…这样循环下去,直到栈为空或者指向的根结点为空。
动图位置:https://leetcode-cn.com/problems/binary-tree-preorder-traversal/solution/er-cha-shu-de-qian-xu-bian-li-by-leetcode-solution/
















