面試常考的點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 }
