二叉树遍历方法总结
深度优先遍历
1) 前序遍历
递归实现:
const preOrder = (root) => {
let result = [];
const traverseNode = (node) => {
if (node) {
// 先根节点
result.push(node.val);
// 然后遍历左子树
traverseNode(node.left);
// 再遍历右子树
traverseNode(node.right);
}
}
traverseNode(root);
return result;
}
非递归实现:
const preOrder = (root) => {
let list = [];
let stack = [];
// 当根节点不为空的时候,将根节点入栈
if (root != null) stack.push(root);
while (stack.length > 0) {
root = stack.pop();
// 先访问根节点
list.push(root.val);
// 我们先打印左子树,然后右子树
// 所以先入栈的是右子树,然后左子树
if (root.right != null) stack.push(root.right);
if (root.left != null) stack.push(root.left);
}
return list;
}
2) 中序遍历
【二叉树遍历方法总结】递归实现:
const inOrder = (root) => {
let result = [];
const traverseNode = (node) => {
if (node) {
// 先遍历左子树
traverseNode(node.left);
// 然后根节点
result.push(node.val);
// 再遍历右子树
traverseNode(node.right);
}
}
traverseNode(root);
return result;
}
非递归实现:
const inOrder = (root) => {
let list = [];
let stack = [];
while (stack.length > 0 || root != null) {
if (root != null) {
// 如果当前节点非空,就将当前节点入栈
stack.push(root);
// 指针向当前节点的左节点方向移动
root = root.left;
} else {
// 当前节点为空,则从栈顶弹出元素
root = stack.pop();
list.push(root.val);
// 指针向右节点方向移动
root = root.right;
}
}
return list;
}
3) 后序遍历
递归实现:
const postOrder = (root) => {
let result = [];
const traverseNode = (node) => {
if (node) {
// 先遍历左子树
traverseNode(node.left);
// 然后遍历右子树
traverseNode(node.right);
// 最后根节点
result.push(node.val);
}
}
traverseNode(root);
return result;
}
非递归实现:
const postOrder = (root) => {
let list = [];
let stack = [];
// 当根节点不为空,将根节点入栈
if (root != null) stack.push(root);
while (stack.length > 0) {
root = stack.pop();
// 由于后序遍历输出顺序是:左=>右=>根
// 先将添加结果的顺序反一下
list.unshift(root.val);
// 然后让左子树先入栈,后右子树
// 这样出栈顺序就变成先右后左
if (root.left != null) stack.push(root.left);
if (root.right != null) stack.push(root.right);
}
return list;
}
推荐阅读
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- java中如何实现重建二叉树
- 种树郭橐驼传(文言句式+古今异义+词类活用+通假字)
- 白杨树
- 08黑龙江迟淑荣弯柳树网络学院第五期学习赵宗瑞老师主讲的(传统文化与身心健康)教育体系心得体会
- [原创]能见沂山一棵树,胜读十年无用书!
- 涵养字外功
- 2018.07.07《刺杀骑士团长》村上春树
- 二叉树路径节点关键值和等于目标值(LeetCode--112&LeetCode--113)
- 撒哈拉沙漠-三毛