JavaScript实现二叉树的遍历(层次,前,中,后)
废话不多说,直接上代码
<script>
//节点
function Node(element, left, right,parents) {
this.element = element;
this.left = left;
this.right = right;
this.parents = parents;
this.show = function() {
return this.element;
}
}
//创建二叉树
function BST() {
this.root = null;
//插入节点
this.insert = function(element){
// 创建新的节点
let node = new Node(element, null, null);
// 判断根节点是否为空,如果为空,那只有node一个节点,也是根节点
if(this.root === null) this.root = node;
else {
// 如果存在根节点,先将根节点赋值给buffer存起来
let buffer = this.root;
while(true) {
// 判断创建的节点的值大于根节点的值-------<2>
if(node.element > buffer.element) {
// 如果根节点的右孩子不存在
if(buffer.right === null) {
// 将新创建的节点赋值给右节点
buffer.right = node;
// 根节点就是其右节点的父节点
node.parents = buffer;
break;
} else {
// 如果根节点的右孩子不为空,将有孩子作为根节点,继续执行<2>
buffer = buffer.right;
}
}
// 判断创建的节点的值小于等于根节点的值-------<3>
if(node.element <= buffer.element) {
// 判断根节点的左孩子是否为空,如果为空
if(buffer.left === null) {
// 将新节点赋值给左孩子
buffer.left = node;
// 根节点是左孩子的父亲
node.parents = buffer;
break;
} else {
// 如果左孩子不为空,那么就将左孩子看成父节点,继续执行<3>
buffer = buffer.left;
}
}
}
}
}
//先序遍历
this.preOrederTraversal = function(node) {
if(node === null) return;
else {
// 根左右
console.log(node.show());
this.preOrederTraversal(node.left);
this.preOrederTraversal(node.right);
}
}
//中序遍历
this.inOrederTraversal = function(node) {
//console.log(node.element);左根右
if(node === null) return;
else {
this.inOrederTraversal(node.left);
console.log(node.show());
this.inOrederTraversal(node.right);
}
}
//后序遍历
this.postOrederTraversal = function(node) {
// 左右根
if(node === null) return;
else {
this.postOrederTraversal(node.left);
this.postOrederTraversal(node.right);
console.log(node.show());
}
}
this.leveltraversal=function(node){
// 从上到下,从左到右
if(node === null) return;
var checkArr = [node];
// 将节点放在checkArr里
console.log(checkArr)
while (checkArr.length > 0) {
var newCheckArr = [];
// 用来存储遍历后的节点
for (var i = 0; i < checkArr.length; i++) {
var item = checkArr[i];
console.log(item.element);
item.left && newCheckArr.push(item.left);
item.right && newCheckArr.push(item.right);
}
checkArr = newCheckArr;
}
}
}
let bst = new BST();
bst.insert(23);
bst.insert(45);
bst.insert(16);
bst.insert(3);
bst.insert(99);
bst.insert(22);
console.log(bst.root)
console.log("先序遍历----------------")
bst.preOrederTraversal(bst.root); //23 16 3 22 45 99)//先序遍历
console.log("层次遍历----------------")
bst.leveltraversal(bst.root); // 23 16 45 3 22 99//层次遍历
console.log("中序遍历----------------")
bst.inOrederTraversal(bst.root); // 3 16 22 23 45 99//中序遍历
console.log("后序遍历----------------")
bst.postOrederTraversal(bst.root); //3 22 16 99 45 23//后序遍历
</script>
提示
在创建二叉树的函数中,一定要进行调试,不然无法理解标记的注释,当然这也是我的理解和借鉴大佬的代码