94.二叉树的中序遍历
给定一个二叉树的根节点
root ,返回 它的 中序 遍历 。示例 1:
输入:root = [1,null,2,3] 输出:[1,3,2]
示例 2:
输入:root = [] 输出:[]
示例 3:
输入:root = [1] 输出:[1]
提示:
- 树中节点数目在范围
[0, 100]内 -100 <= Node.val <= 100
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
思路:中序遍历:左节点->根节点->右节点
方法一:递归
时间复杂度:O(n),其中 n为二叉树节点的个数。二叉树的遍历中每个节点会被访问一次且只会被访问一次。
空间复杂度:O(n),空间复杂度取决于递归的栈深度,而栈深度在二叉树为一条链的情况下会达到 O(n)的级别。
1 /** 2 * Definition for a binary tree node. 3 * function TreeNode(val, left, right) { 4 * this.val = (val===undefined ? 0 : val) 5 * this.left = (left===undefined ? null : left) 6 * this.right = (right===undefined ? null : right) 7 * } 8 */ 9 /** 10 * @param {TreeNode} root 11 * @return {number[]} 12 */ 13 var inorderTraversal = function (root) { 14 const res = []; 15 const inorder = (root) => { 16 if (!root) { 17 return; 18 } 19 inorder(root.left); 20 res.push(root.val); 21 inorder(root.right); 22 } 23 inorder(root); 24 return res; 25 };
方法二:迭代
时间复杂度:O(n),其中 n为二叉树节点的个数。二叉树的遍历中每个节点会被访问一次且只会被访问一次
空间复杂度:O(n),空间复杂度取决于栈深度,而栈深度在二叉树为一条链的情况下会达到 O(n)的级别
1 /** 2 * Definition for a binary tree node. 3 * function TreeNode(val, left, right) { 4 * this.val = (val===undefined ? 0 : val) 5 * this.left = (left===undefined ? null : left) 6 * this.right = (right===undefined ? null : right) 7 * } 8 */ 9 /** 10 * @param {TreeNode} root 11 * @return {number[]} 12 */ 13 var inorderTraversal = function(root) { 14 const res = []; 15 const stack = []; 16 while(root||stack.length){ 17 while(root){ 18 stack.push(root); 19 root = root.left; 20 } 21 root = stack.pop(); 22 res.push(root.val); 23 root = root.right; 24 } 25 return res; 26 };
方法三:Morris遍历
时间复杂度:O(n),其中n为二叉搜索树的节点个数。Morris遍历中每个节点会被访问两次,因此总时间复杂度为O(2n)=O(n)
空间复杂度:O(1)
1 /** 2 * Definition for a binary tree node. 3 * function TreeNode(val, left, right) { 4 * this.val = (val===undefined ? 0 : val) 5 * this.left = (left===undefined ? null : left) 6 * this.right = (right===undefined ? null : right) 7 * } 8 */ 9 /** 10 * @param {TreeNode} root 11 * @return {number[]} 12 */ 13 var inorderTraversal = function (root) { 14 const res = []; 15 let predecessor = null; 16 while (root) { 17 if (root.left) { 18 predecessor = root.left; 19 while (predecessor.right && predecessor.right !== root) { 20 predecessor = predecessor.right; 21 } 22 if (!predecessor.right) { 23 predecessor.right = root; 24 root = root.left; 25 } else { 26 res.push(root.val); 27 predecessor.right = null; 28 root = root.right; 29 } 30 } 31 else { 32 res.push(root.val); 33 root = root.right; 34 } 35 } 36 return res; 37 };

浙公网安备 33010602011771号