给定一个二叉树的根节点 root ,返回它的 中序 遍历。
示例 1:
输入:root = [1,null,2,3]
输出:[1,3,2]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
示例 4:
输入:root = [1,2]
输出:[2,1]
示例 5:
输入:root = [1,null,2]
输出:[1,2]
提示:
- 树中节点数目在范围 [0, 100] 内
- -100 <= Node.val <= 100
方法一:递归法
解题思路
1.定义一个数组来存放遍历过的元素
2.定义一个左根右的遍历函数,递归调用即可。在遍历过程中将节点的值push进数组中。
代码
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var inorderTraversal = function(root) {
const res = []
const rec = (n) => {
if(!n) return
rec(n.left)
res.push(n.val)
rec(n.right)
}
rec(root)
return res
};
方法二:迭代法
代码
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var inorderTraversal = function(root) {
const res = [];
const stack = [];
let p = root;
while (stack.length || p) {
// 将所有节点的左节点全部推入栈中
while (p) {
stack.push(p);
p = p.left;
}
// 逐一访问每个节点及其右节点
const n = stack.pop();
res.push(n.val)
p = n.right;
}
return res
};
时空分析
时间复杂度:O(n)
空间复杂度:O(n)