二叉树的非递归前中后序遍历

78 阅读1分钟

前序遍历

var preorderTraversal = function(root) {
    let res = [];
    let stack = [];
    while(root||stack.length){
        while(root){
            stack.push(root);
            res.push(root.val);
            root = root.left;
        }
        root = stack.pop();
        root = root.right;
    }
    return res;
};

中序遍历

    let res = [];
    let stack = [];
    while(root||stack.length){
        while(root){
            stack.push(root);
            root = root.left;
        }
        root = stack.pop();
        res.push(root.val);
        root = root.right;
    }
    return res;
};

前序遍历和中序遍历不同点是插入节点的位置,前序是在遍历一个左节点后就插入,中序是在遍历完当前路径的所有左节点后插入。 后序遍历

var postorderTraversal = function(root) {
    let res = [];
    let stack = [];
    while(root||stack.length){
        while(root){
            stack.push(root);
            res.unshift(root.val);
            root = root.right;
        }
        root = stack.pop();
        root = root.left;
    }
    return res;
};
后序遍历的区别是先入栈右节点,插入方式是反插,这样就能保证先左后右再插入的顺序了。