思路
从根节点开始,访问左节点,有就继续访问左节点的左节点和右节点,没有就从右开始,俩个都没有,结束。
代码
//根节点入栈
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): 栈最大就是所有节点全进去