js前序遍历等
文章目录
- 一、数据结构
- 二、先序遍历
- 三、中序遍历
- 四、后序遍历
- 五、层序遍历
前序遍历、中序遍历、后序遍历、层序遍历
一、数据结构
// 二叉树的数据结构; 为节点初始化属性和子节点,数据属性这里只有value
// lNode: 左子节点
// rNode: 右子节点
const root = {
value: "ROOT",
lNode: {
value: "A",
lNode: {
value: "C",
lNode: { value: "E", lNode: null, rNode: null },
rNode: { value: "F", lNode: null, rNode: null }
},
rNode: { value: "D", lNode: { value: "G", lNode: null, rNode: null }, rNode: null }
},
rNode: { value: "B", lNode: null, rNode: null }
};
二、先序遍历
// 先序遍历
const preorderTraverse = (node) => {
if (node === null) return;
// 注意这里是console,做测试效果,其实可以得到元素的顺序,做其他排序等操作
console.log("value", node?.value);
preorderTraverse(node.lNode);
preorderTraverse(node.rNode);
};
try {
preorderTraverse(root);
} catch (error) {
console.log("error", error);
}
三、中序遍历
// 中序遍历
const inorderTraverse = (node) => {
if (node === null) return;
inorderTraverse(node.lNode);
console.log(node.value);
inorderTraverse(node.rNode);
};
try {
inorderTraverse(root);
} catch (error) {
console.log("error", error);
}
四、后序遍历
// 后序遍历
const postorderTraverse = (node) => {
if (node === null) return;
postorderTraverse(node.lNode);
postorderTraverse(node.rNode);
console.log(node.value);
};
try {
postorderTraverse(root);
} catch (error) {
console.log("error", error);
}
五、层序遍历
// 层序遍历
const sequenceTraverse = (root) => {
if (!root) return;
let queue = []; // 队列
queue.push(root); // 初始队列
// 循环队列;循环的过程中不断拆分节点,左右先后入队
while (queue.length) {
const node = queue.shift(); // 弹出队首元素
console.log(node.value);
// 每个元素都要拆分左右子树,并且入队
if (node.lNode) {
queue.push(node.lNode);
}
if (node.rNode) {
queue.push(node.rNode);
}
}
};
try {
sequenceTraverse(root);
} catch (error) {
console.log("error", error);
}