【算法-LeetCode】94. 二叉树的中序遍历(二叉树;递归;LeetCode判题机制)

94. 二叉树的中序遍历 - 力扣(LeetCode)

发布:2021年8月12日10:59:48

问题描述及示例

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

示例 1:

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

示例 2:

在这里插入图片描述输入:root = []
输出:[]

示例 3:

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

示例 4:

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

提示:
树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100

我的题解

我的题解1(递归遍历)

思路比较直接,运用递归即可。值得注意的是,要注意递归的结束条件,否则可能会出现无法读取null值属性的的错误:【TypeError: Can't read property 'left' of null】。我一开始把结束条件写成了:if(!root.left && !root.right,也就是当前节点root不为叶子节点时,于是就出现了下面的错误。

在这里插入图片描述
同时也要注意之前在我的博客:【算法-LeetCode】129. 求根节点到叶节点数字之和_赖念安的博客-CSDN博客 中提到过的一个问题:LeetCode的判题机制。如果你在原始模板之外定义了全局变量,那可能会出现结果累积的情况,所以要及时将某些全局变量置空。下面的参考链接中谈到了LeetCode的运行机制。感谢博主分享!

参考:【微信公众号:力扣加加 2021-08-11】你不知道的 LeetCode 技巧(第一篇)

一开始我是把result变量定义在原始的函数外,所以它将累积所有测试用例的结果,因此应该要将result在每次运行测试用例前置空,但是由于递归的特性,置空的时机不是很好把握,所以,我将递归逻辑封装在了一个辅助函数inOrderRecursion()中,同时将result移入inorderTraversal()

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var inorderTraversal = function(root) {
  // result用于存储中序遍历后的结果
  let result = [];
  return inOrderRecursion(root);

  // 辅助函数inOrderRecursion用于完成递归逻辑
  function inOrderRecursion(node) {
    // 如果当前遍历节点不为空,则进行下方的递归操作,
    // 注意中序遍历是先左子节点(左子树),再当前节点,最后是由子节点(右子树)
    if(node) {
      inOrderRecursion(node.left);
      // 这一步操作可以抽象为visit(node),即对当前节点的一系列访问操作
      result.push(node.val);	
      inOrderRecursion(node.right);
    }
    // return操作可以放到递归外,只需改变相应的返回逻辑即可
    return result;
  }
};


提交记录
68 / 68 个通过测试用例
状态:通过
执行用时:104 ms, 在所有 JavaScript 提交中击败了7.26%的用户
内存消耗:38 MB, 在所有 JavaScript 提交中击败了38.26%的用户
时间:2021/08/12 11:14

可以看到,上面的程序无论是时间还是空间上的表现都不是很好,所以应该有比递归性能更好的解法。

官方题解

更新:2021年7月29日18:43:21

因为我考虑到著作权归属问题,所以【官方题解】部分我不再粘贴具体的代码了,可到下方的链接中查看。

更新:2021年8月12日11:15:07

参考:二叉树的中序遍历 - 二叉树的中序遍历 - 力扣(LeetCode)

【更新结束】

有关参考

更新:2021年8月12日11:32:44
参考:【微信公众号:力扣加加 2021-08-11】你不知道的 LeetCode 技巧(第一篇)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值