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的运行机制。感谢博主分享!
一开始我是把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
【更新结束】
有关参考
更新:2021年8月12日11:32:44
参考:【微信公众号:力扣加加 2021-08-11】你不知道的 LeetCode 技巧(第一篇)