题目描述

给定一个二叉树,返回它的中序 遍历。

示例:

输入: [1,null,2,3]
1
\
2
/
3

输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

递归:

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val) {
  4. * this.val = val;
  5. * this.left = this.right = null;
  6. * }
  7. */
  8. /**
  9. * @param {TreeNode} root
  10. * @return {number[]}
  11. */
  12. var inorderTraversal = function(root) {
  13. let res = [];
  14. dfs(root, res);
  15. return res;
  16. };
  17. function dfs(root, res) {
  18. if (root === null) {
  19. return ;
  20. }
  21. dfs(root.left, res);
  22. let val = root.val;
  23. if (val != null) {
  24. res.push(root.val);
  25. }
  26. dfs(root.right, res);
  27. }

栈 + 标记:

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val) {
  4. * this.val = val;
  5. * this.left = this.right = null;
  6. * }
  7. */
  8. /**
  9. * @param {TreeNode} root
  10. * @return {number[]}
  11. */
  12. var inorderTraversal = function(root) {
  13. let res = [];
  14. // 先把root放栈里
  15. let stack = [root];
  16. // 直到栈处理完毕之前都做这个循环
  17. while (stack.length) {
  18. // 取出栈顶元素
  19. let node = stack.pop();
  20. // 看下是否是节点,如果是,按遍历反序推进栈里,因为这样出栈才是顺序
  21. if (node instanceof TreeNode) {
  22. stack.push(node.right);
  23. // 这里直接把值推进去,就可以区分是否子树
  24. stack.push(node.val);
  25. stack.push(node.left);
  26. // 看下如果是值的话,直接写进遍历结果中
  27. } else if (typeof node === 'number') {
  28. res.push(node);
  29. }
  30. }
  31. return res;
  32. };

栈:(时间跟上面的一样,但上面的容易理解很多)

  1. var inorderTraversal = function(root) {
  2. const res = [];
  3. const stk = [];
  4. while (root || stk.length) {
  5. while (root) {
  6. stk.push(root);
  7. root = root.left;
  8. }
  9. root = stk.pop();
  10. res.push(root.val);
  11. root = root.right;
  12. }
  13. return res;
  14. };