记一次面试痛点
起因
今天面试的时候,面试官让写一个对二叉树的非递归DFS实现,可能是紧张了吧,当然更大原因是因为菜,导致最后没有做出来。希望面试官给个机会,虽然基本是不可能的。
当时心路历程
这题不是一看就非常简单吗,递归分分钟实现,非递归不就按照递归代码改改就行了。且递归嘛,不就是用栈嘛,啥都想好了,看我怎么秒杀面试官
结果:。。。没做出来,脑袋发懵,自己好菜啊。。递归玩多了,迭代还做不出来了。
实现
其实就可以把其当作二叉树的先序遍历,我特么想打死当时的自己,面试前命名都快压中题目了,结果一扫而过,心态崩了
上题: 前序遍历二叉树
递归实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
dfs(root,res);
return res;
}
public void dfs(TreeNode root,List<Integer> res){
if(root == null){
return;
}
res.add(root.val);
dfs(root.left,res);
dfs(root.right,res);
}
}
非递归实现
解释:
- 肯定是用栈来实现的
- 先左后右
- 如果左边一直有,就存进res,且压入栈
- 如果root == null了,说明到了叶子节点,就开始弹栈,将root变为弹出来的右节点
- 大循环,肯定是搜索到了最右端的叶子结点了且栈空了才结束
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {