我開了乙個leetcode會員,選擇了一些高頻率題目。這個系列是希望幫助大家每天花30分鐘的題目了解面試高頻題,讓大家面試更加游刃有餘。
本期我們講解三道樹的簡單題。上期我們說到關於樹的題目總是會跟遞迴扯上關係,而本期我們從遞迴入手,引出迭代的做法,比如說利用佇列、棧等資料結構代替遞迴操作。本期所用的樹的資料結構均如下:
class
treenode
}
題意:層次遍歷一棵二叉樹,自底向上返回list>,如下圖這道題相信本科學過《資料結構》的同學一眼就知道這是廣度優先搜尋,要用佇列這個資料結構儲存結點,稍稍需要思考的有兩點:1.如何將每層放入乙個list;2.如何自底向上儲存。對於第乙個問題,我們可以將每一層的佇列長度s存下,然後通過for迴圈將每一層的val存在list中。對於第二個問題,我們可以使用arraylist中的add方法,add方法的第乙個引數就是index,即加入的位置。完整**如下:
public list
>
levelorderbottom
(treenode root)
ans.
add(
0,temp);}
return ans;
}
以上我們使用了廣度優先搜尋,但事實上,這道題還可以使用深度優先搜尋。深度優先搜尋的思想是,記錄每乙個結點所在的層數,這樣相同層數的結點從左到右依次放在同乙個list中。完整**如下:
public list
>
levelorderbottom
(treenode root)
void
levelmaker
(list
> list, treenode root,
int level)
levelmaker
(list, root.left, level+1)
;levelmaker
(list, root.right, level+1)
; list.
get(list.
size()
-level-1)
.add
(root.val)
;}
題意:給乙個遞增的陣列,返回一棵平衡的二叉搜尋樹,如下圖題意:判斷給定的二叉樹是否對稱這道題我們的第一反應就是遞迴,根節點的左右兩個子樹對稱,那麼這棵樹就對稱。當然一定是從上到下依次判斷的,不然不好確定比較的物件。**如下:這道題用遞迴做的確簡單,需要注意的就是邊界條件,那能不能不用遞迴呢?能!只需要借助乙個棧,控制好入棧出棧順序,就可以實現判斷。**如下:public
boolean
issymmetric
(treenode root)
boolean
help
(treenode left,treenode right)
今天我們介紹的幾道題都與迭代有關,對比遞迴的方法,我們發現普遍來說遞迴會比迭代**量少、思路清晰,所以我們更推薦各位同學使用遞迴。當然也不排除面試官讓你使用兩個方法。public
boolean
issymmetric
(treenode root)
return
true
;}
明天我們將介紹樹的中等難度題,你們準備好了嗎?
關注我,更多演算法知識點告訴你。leetcode 二叉樹 對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3 但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3 方法一 遞迴 思路 如果乙個樹的左子樹與右子樹映象對稱,則該樹是對稱的 兩個樹互為映象的...
LeetCode (二叉樹)反轉二叉樹
遞迴交換每乙個節點的左右子樹,重點在於訪問每乙個節點,然後交換左右子樹 definition for a binary tree node.struct treenode struct treenode inverttree struct treenode root 由於至少要講每乙個節點都訪問一次...
(二叉樹提高題)還原二叉樹
給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的高度。輸入格式 輸入首先給出正整數n 50 為樹中結點總數。下面兩行先後給出先序和中序遍歷序列,均是長度為n的不包含重複英文本母 區別大小寫 的字串。輸出格式 輸出為乙個整數,即該二叉樹的高度。輸入樣例 9 abdfghiec fdhgi...