问题
给定一个二叉树的根节点 root ,返回它的中序遍历。
输入:root = [1,null,2,3]
输出:[1,3,2]
输入:root = []
输出:[]
输入:root = [1]
输出:[1]
分析
1)二叉树的中序遍历,即按照左子树、根节点、右子树的方式遍历树。
2)左子树或右子树可以按照同样的方式遍历,直到遍历完整棵树,具有递归的特点。
3)定义中序遍历函数。先遍历左子树,再将此时的root节点放入数组,最后遍历右子树。递归结束条件为当前节点为空节点。
代码
/**
* @param {TreeNode} root
* @return {number[]}
*/
var inorderTraversal = function(root) {
var res = []
// 定义遍历方法
var zx = function(root){
if(!root){
return
}
// 中序在中间位置,前序和后序原理相同。
zx(root.left)
res.push(root.val)
zx(root.right)
}
// 不要忘记调用方法
zx(root)
return res
};
扩展:通过迭代的方法实现中序遍历
通过两个数组模拟栈的方式,一个用来处理中间过程,一个存储最终结果。
var inorderTraversal = function(root) {
const res = []
const stk = []
// 结束条件为:root为空/栈为空
while(root || stk.length){
// 1)迭代找到最左边的节点,过程中的节点push到栈中
while(root){
stk.push(root)
root = root.left
}
// 2)栈顶的节点pop出,并将值push到结果数组中
root = stk.pop()
res.push(root.val)
// 3)判断当前节点是否有右子树,如果有又回到第一步
root = root.right
}
return res
}