LeetCode算法学习之--Tree--二叉树的中序遍历

341 阅读2分钟

大家好今天给大家分享下一道 LeetCode 中等难度 的题目[94. 二叉树的中序遍历]

题目

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

输入:root = [1,null,2,3]
输出:[1,3,2]
示例 2:

输入:root = []
输出:[]
示例 3:

输入:root = [1]
输出:[1]


分析

1.二叉树 有左右2个节点

2.中序遍历:先遍历左边节点 然后是当前节点 然后是右边的节点

3.返回记录节点的数组

解法

1.递归

2.迭代

解法一:递归

思路
递归遍历比较简单,主要是先 左-中-右
1.先一直递归左边的点,当遇到终止条件 root===null的时候return
2.然后记录当前节点,再递归右侧节点

*/

var inorderTraversal = function (root) {
  const arr = [];
  visitNode(root, arr);
  return arr;
};

function visitNode(root, arr) {
  if (!root) {
    return;
  }
  const { left, right, val } = root;
  visitNode(left, arr);
  arr.push(val);
  visitNode(right, arr);
}

/* 复杂度
时间 O(n) 每个节点访问一次
空间 O(n) 
*/

解法二:迭代

思路
因为中序遍历的访问顺序为 左 =》中=》右 
所以迭代主要是利用栈的先进后出的思想来存储节点。
1.使用循环把一个栈的左子元素不断不断推入stack中。当左子元素为空了停止循环
2.出栈末尾的元素,然后记录下来
3.然后再开始把当前右子节点的 左子节点放入栈中,以备后面的使用
*/
var inorderTraversal = function (root) {
  const res = [];
  let stack = [];
  let cur = root;
  while (true) {
    //   当stack为空且cur 为null 则说明所有的元素已经都访问过了,就可以停止循环
    if (!cur && !stack.length) {
      break;
    }
    // 获取左子元素的栈
    stack = getLeftChildStack(cur, stack);
    // 出栈末尾值 并且记录
    cur = stack.pop();
    res.push(cur.val);
    // 改变当前值为右子元素,以备下一次迭代遍历出右子元素的左边节点
    cur = cur.right;
  }

  return res;
};

function getLeftChildStack(node, stack) {
  // 把所有的左子节点存入栈中
  while (node) {
    stack.push(node);
    node = node.left;
  }
  return stack;
}

/* 复杂度
时间 O(n) 每个节点访问一次
空间 O(n) 递归栈的深度 
*/

总结

今天这道题是一个很基本的遍历题,基本上每个学习内容上都有,代码也是大同小异,主要是练习树的常见遍历方式

大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢

大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持

文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com