面试常考的点BFS和DFS的遍历。
给一棵二叉树,写出他的BFS遍历情况(应该就是按层遍历)以及DFS遍历情况。
BFS 用一个队列存储节点。Queue
BFS实现代码如下:
1 // 给定跟节点 求出BFS遍历二叉树的锅。 2 public List<TreeNode> Bfs_tree(TreeNode root){ 3 Queue<TreeNode> myq = new LinkedList<>(); 4 List<TreeNode> res = new ArrayList<>(); 5 if(root==null) return null; 6 myq.add(root); 7 while(!myq.isEmpty()){ 8 int len = myq.size(); 9 for(int i=0;i<len;i++){ 10 if(myq.peek().left!=null) myq.add(myq.peek().left); 11 if(myq.peek().right!=null) myq.add(myq.peek().right); 12 res.add(myq.poll()); 13 } 14 } 15 return res; 16 }
Bfs可参见leetcode:https://leetcode.com/submissions/detail/61715373/
DFS 遍历二叉树分成前中后序遍历。前面博客中写过了。用栈。
一般的DFS如下:
1 //Dfs遍历二叉树 先压栈柚子树 然后左子树 2 public List<TreeNode> Dfs_tree(TreeNode root){ 3 Stack<TreeNode> sta = new Stack<>(); 4 List<TreeNode> res = new ArrayList<>(); 5 if(root==null) return null; 6 // res.add(root); 7 sta.add(root); 8 while(!sta.isEmpty()){ 9 TreeNode temp = sta.pop(); 10 res.add(temp); 11 if(temp.right!=null) sta.push(temp.right); 12 if(temp.left!=null) sta.push(temp.left); 13 } 14 return res; 15 16 }