【主线任务】掌握二叉树前中后序遍历的递归法、迭代法和统一迭代法(统一迭代法还没掌握,已经晕了🌹)
【递归】
1. 确定参数及返回值
2. 确定终止条件
3. 确定单次执行逻辑
- 前序遍历
【递归法思路】
【迭代法思路】递归函数底层实现也是用栈,所以我们可以模拟栈来实现二叉树的遍历:按 “中左右” 的顺序依次把元素放入栈中,再pop()
,放入数组中,循环直至栈为空。
// 递归解法
var preorderTraversal = function(root) {
const res = [];
const dif = root => {
if (root === null) return;
res.push(root.val); // 中
dif(root.left); // 左
dif(root.right); // 右
}
dif(root);
return res;
};
// 迭代解法
var preorderTraversal = function (root) {
if (!root) return [];
let stack = [root], res = [];
while (stack.length) {
let cur = stack.pop();
res.push(cur.val);
cur.right && stack.push(cur.right);
cur.left && stack.push(cur.left);
}
return res;
}
- 后序遍历
【递归法思路】三种遍历的递归法其实差不多,按照后序遍历子树的顺序依次执行 “左右中” 的代码逻辑即可。
【迭代法思路】后序遍历的方法和坐了前序遍历代码的顺风车。前序遍历顺序:“中左右”,入栈顺序为先右子树后左子树,把入站顺序改为先左子树后右子树顺序入栈,变为 “中右左”,再把得到的数组reverse()
,即可得到 ”左右中“ 的顺序。
// 递归解法
var postorderTraversal = function(root) {
let res = [];
const traversal = (root) => {
if (root === null) return;
traversal(root.left);
traversal(root.right);
res.push(root.val);
}
traversal(root);
return res;
};
// 迭代解法
var postorderTraversal = (root) => {
if (!root) return [];
let stack = [root], res = [];
while (stack.length) {
let cur = stack.pop();
res.push(cur.val);
cur.left && stack.push(cur.left);
cur.right && stack.push(cur.right);
}
return res.reverse();
}
- 中序遍历
【递归法思路】三种遍历的递归法其实差不多,按照中序遍历子树的顺序依次执行 “左中右” 的代码逻辑即可。
【迭代法思路】此时入栈顺序和要遍历的顺序不一样,所以不能沿用前序遍历的思路。要先把元素都入栈(cur = cur.left
)直至到第一个要遍历的元素为止(cur === null
),然后pop()
栈中的元素,添加到数组res
中,再检查有没有右子树(cur = cur.right
)。若有右子树就存入栈中检查是否有左子树,没有则继续pop()
栈中元素。
// 递归解法
var inorderTraversal = function(root) {
let res = [];
const trasversal = (root) => {
if (root === null) return;
trasversal(root.left);
res.push(root.val);
trasversal(root.right);
}
trasversal(root);
return res;
};
// 迭代解法
var inorderTraversal = function (root) {
let stack = [], cur = root, res = [];
while (cur !== null || stack.length) {
if (cur !== null) {
stack.push(cur);
cur = cur.left;
} else {
cur = stack.pop();
res.push(cur.val);
cur = cur.right;
}
}
return res;
}
参考代码随想录:https://www.programmercarl.com/