如同Queue章節提到,BFS使用 Queue依序處理每層節點,所以適合
DFS:適合解全域最佳解、路徑類型。
BFS:適合最短路徑、分層統計類型。
照慣例我們刷個幾題適合用BFS來解的題目
題目:給一顆樹依層分類奇數層由左而右排,偶數層由右向左排
輸入:root = [3,9,20,null,null,15,7]
輸出:[[3],[20,9],[15,7]]
解法:使用BFS逐層找節點,並依照目前的層數決定排序。
// Definition for a binary tree node.
// #[derive(Debug, PartialEq, Eq)]
// pub struct TreeNode {
// pub val: i32,
// pub left: Option<Rc<RefCell<TreeNode>>>,
// pub right: Option<Rc<RefCell<TreeNode>>>,
// }
//
// impl TreeNode {
// #[inline]
// pub fn new(val: i32) -> Self {
// TreeNode {
// val,
// left: None,
// right: None
// }
// }
// }
// BFS
// push root to queue level=1
// for i in 0..queue.len() get current level node and push subtree
// after itor push current nodes and level+=1
// init root=[3,9,20,null,null,15,7] queue=[] ans:[]
// root=[9,20,null,null,15,7] queue=[3] ans:[] level=1
// root=[null,null,15,7] queue=[9,20] ans:[[3]] level=2
// root=[] queue=[15,7] ans:[[3],[20,9]] level=3
// root=[] queue=[] ans:[[3],[20,9],[15,7]] level=4
// finish return ans
use std::rc::Rc;
use std::cell::RefCell;
use std::collections::VecDeque;
impl Solution {
pub fn zigzag_level_order(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<Vec<i32>> {
let Some(root)=root else{ return vec![]};
let mut deque = VecDeque::new();
let mut level =1;
let mut return_ans=Vec::new();
deque.push_back(root);
while deque.len()>0 {
let level_size = deque.len();
let mut level_ans=Vec::new();
for i in 0..level_size {
let Some(node)=deque.pop_front() else { continue};
let rc=node.borrow();
level_ans.push(rc.val);
if(rc.left.is_some()){
deque.push_back(rc.left.clone().unwrap());
}
if(rc.right.is_some()){
deque.push_back(rc.right.clone().unwrap());
}
}
if(level%2==0){
level_ans.reverse();
}
return_ans.push(level_ans);
level+=1;
}
return_ans
}
}
題目:找到離跟節點最短的葉節點,回傳他在哪一層
輸入:root = [3,9,20,null,null,15,7]
輸出:2
做法:用BFS去找第一個葉節點,能確保他是最短路徑並回傳他在哪一層
// Definition for a binary tree node.
// #[derive(Debug, PartialEq, Eq)]
// pub struct TreeNode {
// pub val: i32,
// pub left: Option<Rc<RefCell<TreeNode>>>,
// pub right: Option<Rc<RefCell<TreeNode>>>,
// }
//
// impl TreeNode {
// #[inline]
// pub fn new(val: i32) -> Self {
// TreeNode {
// val,
// left: None,
// right: None
// }
// }
// }
// use BFS find shortest leaf
// init root = [3,9,20,null,null,15,7] queue:[] level=0
// root = [9,20,null,null,15,7] queue:[3] level:1 if sub tree in left or right push to queue else return level
// root = [null,null,15,7] queue:[9,20] level:2 if sub tree in left or right push to queue else return level
// 9 is leaf node return level=2
use std::rc::Rc;
use std::cell::RefCell;
use std::collections::VecDeque;
impl Solution {
pub fn min_depth(root: Option<Rc<RefCell<TreeNode>>>) -> i32 {
let mut deque=VecDeque::new();
let mut level=0;
let Some(node)=root else { return 0 };
deque.push_back(node);
level+=1;
while deque.len()>0 {
let layer_size = deque.len();
for i in 0..layer_size {
let n = deque.pop_front().expect("must have node");
let rc = n.borrow();
if(rc.left.clone().is_none() & rc.right.clone().is_none()){
return level
}
if(rc.left.clone().is_some()){
deque.push_back(rc.left.clone().expect("must have node"));
}
if(rc.right.clone().is_some()){
deque.push_back(rc.right.clone().expect("must have node"));
}
}
level+=1;
}
0
}
}
題目:你從右邊看這顆樹,他會長什麼樣
輸入:root = [1,2,3,null,5,null,4]
輸出:[1,3,4]
做法:由右這顆樹看到的為每層最後一個節點,因此只要記錄每層最後一個節點就好。
// #[derive(Debug, PartialEq, Eq)]
// Definition for a binary tree node.
// pub struct TreeNode {
// pub val: i32,
// pub left: Option<Rc<RefCell<TreeNode>>>,
// pub right: Option<Rc<RefCell<TreeNode>>>,
// }
//
// impl TreeNode {
// #[inline]
// pub fn new(val: i32) -> Self {
// TreeNode {
// val,
// left: None,
// right: None
// }
// }
// }
//init root = [1,2,3,null,5,null,4] queue=[] level=0 last[]
//root = [2,3,null,5,null,4] queue=[1] level=1 last=[]
//root = [null,5,null,4] queue=[2,3] level=2 last=[1]
//root = [] queue=[5,4] level=3 last=[1,3]
//root = [] queue=[] level=4 last=[1,3,4]
//return last [1,3,4]
use std::rc::Rc;
use std::cell::RefCell;
use std::collections::VecDeque;
impl Solution {
pub fn right_side_view(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
let Some(node)=root else { return vec![]};
let mut ans=Vec::new();
let mut deque=VecDeque::new();
let mut level=0;
deque.push_back(node);
level+=1;
while deque.len()>0 {
let layer_size = deque.len();
for i in 0..layer_size {
let n = deque.pop_front().expect("must have node");
let rc=n.borrow();
if(rc.left.clone().is_some()){
deque.push_back(rc.left.clone().expect("must have node"));
}
if(rc.right.clone().is_some()){
deque.push_back(rc.right.clone().expect("must have node"));
}
if(i==layer_size-1){
ans.push(rc.val);
}
}
level+=1;
}
ans
}
}