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 };

 

posted @ 2021-05-19 14:46  icyyyy  阅读(110)  评论(0)    收藏  举报