前言:实现之前忘记了 前中后遍历怎么输入,于是找到了一篇文章颇为生动的遍历博客学习 blog.51cto.com/yang/289993… 供共同学习之
解法1: 递归
function preorderTraversal(root: TreeNode | null): number[] {
let res:Array<number> = []
const _preorderTraversal = (_root)=>{
if(_root==null){
return
}
res.push(_root.val)
_preorderTraversal(_root.left)
_preorderTraversal(_root.right)
}
_preorderTraversal(root)
return res
};
Q:这里我觉得一个有意思的点是可以把res作为参数传到函数里面,最终返回来,但是我会有一个小疑问,每次调用的时候 调用栈里面就会多存一个入参,这样会增加内存,然后导致执行时间增加,这么想有问题吗。于是有把res作为一个全局的变量,然后进行操作,最终作为返回值
方法2:迭代+栈实现 1.要定义一个栈 2.把根元素压入栈 3.迭代,当栈中有元素的时候,就出栈,然后把它的左右节点压入栈。需要注意的是栈是先入后出,所以先压入右节点,再压入左节点
function preorderTraversal(root: TreeNode | null): number[] {
let arr:Array<TreeNode>=[],res:Array<number>=[];
if(root!=null){
arr.push(root) //跟节点入栈
}
while(arr.length>0){ //只要栈不空
let curNode = arr.pop()//第一次往出拿
res.push(curNode.val)
//当前节点的左右节点入栈, 因为栈是先入后出,所以先入右节点
if(curNode.right!=null){
arr.push(curNode.right)
}
if(curNode.left!=null){
arr.push(curNode.left)
}
}
return res
};
Q:关于使用栈处理,我又有了一个问题, 为什么要引入这种方式来处理呢,递归迭代多香,只需要使用三行核心就可以实现,而且不需要使用栈在脑中模拟输出。