[LeetCode] 94. Binary Tree Inorder Traversal

二叉树的中序遍历。中序遍历我记为 左 - 根 - 右

还是用GeeksforGeeks的例子来描述如何做中序遍历吧。

[LeetCode] 94. Binary Tree Inorder Traversal_第1张图片

 

 

Inorder (Left, Root, Right) : 4 2 5 1 3

树的遍历大部分都是可以给出迭代和递归两种做法的,此题我也给出两种做法。两种做法的时间和空间复杂度都一样,都是O(n)。

迭代

(配合例子看)迭代的做法是需要将所有的左孩子先放进栈,这样弹出的时候(15行),最小的左孩子4就被存入结果集了。此时cur指针在stack顶端,2的位置,所以此时才会有17行去看2是否有右孩子。有的话,下一次while循环的一开头,这个右孩子5就会被再次放进栈。

 1 /**
 2  * @param {TreeNode} root
 3  * @return {number[]}
 4  */
 5 var inorderTraversal = function(root) {
 6     let res = [];
 7     if (root === null) return res;
 8     let stack = [];
 9     let cur = root;
10     while (cur !== null || stack.length) {
11         while (cur !== null) {
12             stack.push(cur);
13             cur = cur.left;
14         }
15         cur = stack.pop();
16         res.push(cur.val);
17         cur = cur.right;
18     }
19     return res;
20 };

 

递归

递归的做法很直观,既然是中序遍历,所以根节点需要放在左孩子和右孩子的helper函数中间。

 1 /**
 2  * @param {TreeNode} root
 3  * @return {number[]}
 4  */
 5 var inorderTraversal = function(root) {
 6     let res = [];
 7     if (root === null) return res;
 8     helper(res, root);
 9     return res;
10 };
11 
12 var helper = function(res, root) {
13     if (root === null) return;
14     helper(res, root.left);
15     res.push(root.val);
16     helper(res, root.right);
17 };

你可能感兴趣的:([LeetCode] 94. Binary Tree Inorder Traversal)