SOURCE

// 二叉树遍历
// (a+b*c)-d/e

let tree = {
    value: "-",
    left: {
        value: '+',
        left: {
            value: 'a',
        },
        right: {
            value: '*',
            left: {
                value: 'b',
            },
            right: {
                value: 'c',
            }
        }
    },
    right: {
        value: '/',
        left: {
            value: 'd',
        },
        right: {
            value: 'e',
        }
    }
}

// 先序遍历
let preList = [];
// 非递归遍历
const preOrderUnRecusion = function(node) {
    // 判断二叉树是否为空
    if(node) {
        // 将二叉树压入栈
        let stack = [node];
        // 如果栈不为空,循环遍历
        while(stack.length !== 0) {
            // 从栈中取出一个节点
            node = stack.pop();
            // 将取出节点的值存入到数组中
            preList.push(node.value);
            // 如果存在右子树,将右子树压入栈
            if(node.right) {
                stack.push(node.right);
            }
             // 如果存在左子树,将左子树压入栈
            if(node.left) {
                stack.push(node.left);
            }
        }
    }
}
// preOrderUnRecusion(tree);
// console.log(preList);

// 递归遍历
const preOrderRec = function(node) {
    // 判断二叉树是否为空
    if(node) {
        // 将节点的值存入到数组中
        preList.push(node.value);
        // 递归遍历左子树
        preOrderRec(node.left);
        // 递归遍历右子树
        preOrderRec(node.right);
    }
}
// preOrderRec(tree);
// console.log(preList);


// 中序遍历
// 非递归遍历
const middleOrderUnRec = function(node) {
    // 判断二叉树是否为空
    if(node) {
        // 建立一个栈
        let stack = [];
        // 如果栈不为空或者节点不为空,则循环遍历
        while(stack.length !== 0 || node) {
            // 如果节点不为空
            if(node) {
                // 将节点压入栈
                stack.push(node);
                // 将左子树作为当前节点
                node = node.left;
            }
            // 如果左子树为空
            else {
                // 取出节点
                node = stack.pop();
                // 将取出节点的值放入到数组中
                preList.push(node.value);
                // 把右节点作为现在节点
                node = node.right;
            }
        }
    }
}


// 递归遍历
const middleOrderRec = function(node) {
    if(node) {
        // 递归遍历左子树
        middleOrderRec(node.left);
        // 将节点的值存入到数组中
        preList.push(node.value);
        // 递归遍历右子树
        middleOrderRec(node.right);
    }
}

// middleOrderRec(tree);
// console.log(preList);

// 后序遍历
// 非递归
const postOrderUnRec = function(node) {
    if(node) {
        let stack = [node];
        let temp = null;
        while(stack.length !== 0) {
            // 将栈顶的值保存到变量中
            temp = stack[stack.length -1];
            // 如果存在左子树
            if(temp.left && node !== temp.left && node !== temp.right) {
                // 将左子树压入栈
                stack.push(temp.left);
            }
            // 如果存在右子树
            else if(temp.right && node !== temp.right) {
                // 将右子树压入栈
                stack.push(temp.right);
            }
            else {
                preList.push(stack.pop().value);
                node = temp;
            }
        }
    }
}

// 递归遍历
const postOrderRec = function(node) {
    if(node) {
        // 递归遍历左子树
        postOrderRec(node.left);
        // 递归遍历右子树
        postOrderRec(node.right);
        // 将节点的值放入到数组中
        preList.push(node.value);
    }
}



// 二叉树的广度遍历
const breathTraversal = function(node) {
    if(node) {
        // 把二叉树放入队列中
        let que = [node];
        // 判断队列是否为空
        while(que.length !== 0) {
            // 从队列中取出一个节点
            node = que.shift();
            // 将节点的值保存到数组中
            preList.push(node.value);
            // 如果存在左子树,将左子树放入到队列中
            if(node.left) {
                que.push(node.left);
            }
            // 如果存在右子树,将右子树放入到队列中
            if(node.right) {
                que.push(node.right);
            }
        }
    }
}

breathTraversal(tree);
console.log(preList);
console 命令行工具 X clear

                    
>
console