大家好今天给大家分享下一道 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