今天來看一道比較簡單的題,給定乙個二叉樹,返回其節點值的鋸齒形層次遍歷。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行)。
例如:
給定二叉樹 [3,9,20,null,null,15,7]
返回鋸齒形層次遍歷如下:
[3],bfs列印二叉樹的的層次遍歷就是一層一層的遍歷,也就是我們俗稱的bfs(寬度優先搜尋演算法(又稱廣度優先搜尋)),之前在373,資料結構-6,樹中講過樹的寬度優先搜尋,最簡單的方式就是使用佇列。但這題列印的時候多了乙個條件,就是不能一直從乙個方向列印,要先從左邊列印然後再從右邊列印……,就這樣交替進行,所以這裡要有個變數來判斷是從左往右還是從右往左列印,**比較簡單,我們來看下。[20,9],
[15,7]
public list
>
zigzaglevelorder
(treenode root)
else
//左右子節點如果不為空會被加入到佇列中
if(node.left != null)
queue.
add(node.left);if
(node.right != null)
queue.
add(node.right);}
res.
add(level)
; lefttoright =
!lefttoright;
}return res;
}
上面**中如果把第17-21行的**直接換成第18行的**就是我們之前講過的bfs,就是一層一層往下列印。只不過這裡多了乙個條件的判斷。
當然我們還可以根據每一層是第幾層來判斷,如果根節點是第1層的話,那麼我們在層數是奇數的時候從左往右列印,如果層數是偶數的時候從右往左列印。在前面我們講佇列的時候359,資料結構-3,佇列我們講到了雙端佇列,就是乙個可以在兩邊同時新增和刪除的佇列。這裡我們使用上面兩種方式的結合,來看下**。
public list
>
zigzaglevelorder
(treenode root)
else
level.
add(cur.val);}
res.
add(level);}
return res;
}
dfs列印這題除了使用bfs以外,我們還可以使用dfs。但這裡我們要有個判斷,如果走到下一層的時候集合沒有建立,我們要先建立下一層的集合,**也很簡單,我們來看下。
public list
>
zigzaglevelorder
(treenode root)
private
void
tr**el
(treenode cur, list
> res,
int level)
//遍歷到第幾層我們就操作第幾層的資料
list
list = res.
get(level)
;//這裡預設根節點是第0層,偶數層相當於從左往右遍歷,
// 所以要新增到集合的末尾,如果是奇數層相當於從右往左遍歷,
// 要把資料新增到集合的開頭
if(level %2==
0)list.
add(cur.val)
;else
list.
add(
0, cur.val)
;//分別遍歷左右兩個子節點,到下一層了,所以層數要加1
tr**el
(cur.left, res, level +1)
;tr**el
(cur.right, res, level +1)
;}
總結這題最簡單的一種方式就是參照二叉樹的bfs列印,然後稍作修改,如果當前行是從左往右列印,那麼下一行就從右往左列印。如果當前行是從右往左列印,那麼下一行就從左往右列印,**基本上沒什麼難度。
二叉樹的鋸齒形層次遍歷
給定乙個二叉樹,返回其節點值的鋸齒形層次遍歷。即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行 例如 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7返回鋸齒形層次遍歷如下 3 20,9 15,7 解題思路 鋸齒形層次遍歷,又不單單是層次遍歷,一次從...
二叉樹的鋸齒形層次遍歷
給定乙個二叉樹,返回其節點值的鋸齒形層次遍歷。即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行 例如 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7 複製 返回鋸齒形層次遍歷如下 3 20,9 15,7 複製 definition for a bi...
二叉樹的鋸齒形層次遍歷
給定乙個二叉樹,返回其節點值的鋸齒形層次遍歷。即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行 例如 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7返回鋸齒形層次遍歷如下 3 20,9 15,7 分析 鋸齒型的意思就是,第一層順序,第二層逆序,第三...