问题描述:
给定一个二叉树的根节点root, 返回它的中序遍历。
示例1:
输入:root = [1, null, 2, 3]
输出:[1, 3, 2]
示例2:
输入:root = []
输出:[]
中序遍历:假设有一棵树root, 按照左子树--根--右子树的顺序依次遍历
解题思路1:递归(js实现)
/**
* 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) {
let res = []
const inorder = (root) => {
if(!root){
return null
}
inorder(root.left)
res.push(root.val)
inorder(root.right)
}
inorder(root)
return res
};
解题思路2:迭代。在第一种方法中,隐式调用了一个栈,而在这个方法中,将栈显式的模拟出来。这两种方法本质上是一致的。
- 首先遍历树,将root的左孩子节点入栈,root指针转移到当前节点的左孩子节点。入栈元素分别是1, 2, 4
- 若当前root指针没有左孩子节点了,就将栈顶元素出栈,并保存到结果数组res中,root指针向上移一级
- 将root的右孩子节点压入栈中,更改root指针,直到root指向一个叶子节点。
代码实现(js):
/**
* 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) {
let res = []
let stack = []
while(root || stack.length){
while(root){
// 将根节点push到stack中
stack.push(root)
// 根节点变为原来的左孩子节点
root = root.left
}
// 取出栈顶元素
root = stack.pop()
// 将root值存入res中
res.push(root.val)
// 访问右子树
root = root.right
}
return res
};