144.二叉树的前序遍历

87 阅读1分钟

思路

从根节点开始,访问左节点,有就继续访问左节点的左节点和右节点,没有就从右开始,俩个都没有,结束。

代码

    //根节点入栈
    if(root) stack.push(root)
    //拿到根节点的val,现在还差左和右
    const n = stack.pop()
    res.push(n.val)
    //先将右子树入栈,在将左子树入栈
    if(n.right) stack.push(n.right)
    if(n.left) stack.push(n.left)
    return res;

现在res的顺序为根,左,右,可以开始循环了

怎么循环?

左子树出栈的时候其子节点可以入栈,然后出栈,以此类推。

var preorderTraversal = function (root) {
    const res = []
    const stack = []
    //根节点入栈
    if (root) stack.push(root)
    //栈空结束
    while (stack.length) {
        //拿到根节点的val,现在还差左和右
        const n = stack.pop()
        res.push(n.val)
        //先将右子树入栈,在将左子树入栈
        if (n.right) stack.push(n.right)
        if (n.left) stack.push(n.left)
    }
    return res;
};

复杂度

时间O(n):只有一层循环 空间O(n): 栈最大就是所有节点全进去