这是跟着代码随想录的顺序学习算法的第十四天。
以下是学习时自己的一些理解与笔记,如有错误欢迎指正与讨论。
二叉树的迭代遍历
参考相关链接:
笔记
- 二叉树定义
funtion TreeNode(val, left, right) {
this.val = (val === undefined ? 0 : val);
this.left = (left === undefined ? null : left);
this.right = (right === undefined ? null : right);
}
-
简单的判断可考虑用短路运算代替!
-
还有一点是,用字面量创建数组时,如果直接赋值(不管是
null
还是undefined
),会改变数组的length
属性,即为中括号里面的元素个数, -
故在利用数组长度做判断条件的时候需要注意数组的定义方式。
代码随想录 JS
版本
// 前序遍历
// 入栈 右 -> 左
// 出栈 中 -> 左 -> 右
var preorderTraversal = function(root, res = []) {
if(!root) return res;
const stack = [root];
let cur = null;
while(stack.length) {
cur = stack.pop();
res.push(cur.val);
cur.right && stack.push(cur.right);
cur.left && stack.push(cur.left);
}
return res;
};
// 中序遍历
// 入栈 左 -> 右
// 出栈 左 -> 中 -> 右
var inorderTraversal = function(root, res = []) {
const stack = [];
let cur = root;
while(stack.length || cur) {
if(cur) {
stack.push(cur);
// 左
cur = cur.left;
} else {
// --> 弹出 中
cur = stack.pop();
res.push(cur.val);
// 右
cur = cur.right;
}
};
return res;
};
// 后序遍历
// 入栈 左 -> 右
// 出栈 中 -> 右 -> 左 结果翻转
var postorderTraversal = function(root, res = []) {
if (!root) return res;
const stack = [root];
let cur = null;
do {
cur = stack.pop();
res.push(cur.val);
cur.left && stack.push(cur.left);
cur.right && stack.push(cur.right);
} while(stack.length);
return res.reverse();
};