携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情
一、题目
LeetCode 二叉树的中序遍历
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
示例 1:
输入:root = [1,null,2,3]
输出:[1,3,2]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
提示:
树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100
二、题解
需要对给定的一个二叉树进行中序遍历,中序遍历就是如果左子树不为空的话就先遍历左子树节点,然后再遍历根节点,最后如果右子树不为空的话就遍历右子树节点,对于子树节点也是中序遍历。
方法一
可以直接根据中序遍历的规则来用递归方法遍历二叉树的节点,首先需要定义一个数组list来记录中序遍历的结果,然后定义递归方法来遍历二叉树节点,参数首先就需要的是二叉树根节点了,然后还得要一个数组记录遍历的结果,首先判断如果当前参数的树节点为空的话就直接结束递归,说明之后没有节点了,否则获取根节点的左子树去递归遍历,然后获取根节点值,将根节点值加入到结果数组中,最后再获取根节点的右子树去递归遍历,最后在递归遍历完成的时候返回数组中记录的结果。
方法二
也可以通过BFS广度优先搜索的方式遍历二叉树节点,首先定义队列,将根节点加入到队列中,当队列元素不为空的时候就遍历队列元素,直到队列元素为空时结束,然后取出队列元素节点,按中序遍历的顺序,如果当前节点的左子树不为空就加入到队列中,然后获取当前节点加入到遍历结果集合,最后获取当前节点的右子树不为空就加入到队列中继续遍历,直到最后遍历结束返回遍历的结果。
三、代码
方法一 Java代码
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
dfs(root, list);
return list;
}
public void dfs(TreeNode root, List<Integer> list) {
if (root == null) {
return;
}
dfs(root.left, list);
list.add(root.val);
dfs(root.right, list);
}
}
时间复杂度:O(n),需要遍历一次二叉树的节点
空间复杂度:O(n),递归消耗的栈空间以及使用的结果数组。