leetcode4 9 樹的深度優先搜尋

2021-10-04 21:01:09 字數 2390 閱讀 5410

問題描述:

給定兩個二叉樹,編寫乙個函式來檢驗它們是否相同。

如果兩個樹在結構上相同,並且節點具有相同的值,則認為它們是相同的。

基本思路:第一眼想到的是遞迴,因為我其實對於樹的深度優先搜尋不是十分熟悉,只知道可以使用stack棧來實現。但是今天的計畫本來就是樹的優先搜尋入門,所以我還是打算使用深度優先搜尋來實現,基本**如下:

bool issametree(treenode* p, treenode* q) 

else }}

嗯,這只是難度為簡單的題目,但是做起來也很easy。

問題描述:

給定乙個二叉樹,檢查它是否是映象對稱的。

例如,二叉樹 [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

基本思路:因為是剛剛做完上面一題,所以想法很簡單,對比左子樹與右子樹就行了。左子樹的左子樹(右子樹)與右子樹的右子樹(左子樹)對比,是否是相同的樹,如果是,那麼繼續。可能說的不是很清晰,那麼直接上**吧:

bool leftsymmetricright(treenode* p, treenode* q)

else

}}bool issymmetric(treenode* root)

}

問題描述:

給定乙個二叉樹,找出其最大深度。

二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。

說明: 葉子節點是指沒有子節點的節點。

示例:給定二叉樹 [3,9,20,null,null,15,7],

3/ \

9  20

/  \

15   7

返回它的最大深度 3 。

基本思路:由於遞迴現在用的比較熟練,所以第一眼還是遞迴實現的dfs,基本**如下:

int mdeep(treenode* root, int deep)

}int maxdepth(treenode* root)

但是今天的重點是dfs,不能只靠遞迴實現啊,所以又出來了乙個stack版本的dfs:

int maxdepth1(treenode* root)

p = sta.top().first;

depth = sta.top().second;

max = std::max(max, depth);

sta.pop();

p = p->right;

}return max;

}

唉,我喜歡遞迴不是沒有道理的,你看他多簡潔啊?

問題描述:

給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。

本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。

示例:給定的有序鍊錶: [-10, -3, 0, 5, 9],

乙個可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個高度平衡二叉搜尋樹:

0/ \

-3   9

/   /

-10  5

listnode* findmid(listnode* head)

cur = slow;

slow = slow->next;

if (cur->next != null)

cur->next = null;

return slow;

}treenode* sortedlisttobst(listnode* head)

再貼一下別人的**:

treenode* sortedlisttobst(listnode* head) 

treenode* buildtree(listnode* head, listnode* tail)

treenode* root = new treenode(slow->val);

root->left = buildtree(head, slow);

root->right = buildtree(slow->next, tail);

return root;

}

這道題確實不適合使用dfs去做。基本思路就是找到中間節點作為子樹的根節

leetcode 49 雜湊 字典 質數

解法一 容易想到用counter計數然後作為key放進字典,但字典不能被hash,所以只能用桶再轉tuple,如下 class solution def groupanagrams self,strs list str list list str d for s in strs bm 0 for i...

leetcode 49 字母異位

給定乙個字串陣列,將字母異位片語合在一起。字母異位詞指字母相同,但排列不同的字串。示例 輸入 eat tea tan ate nat bat 輸出 ate eat tea nat tan bat 說明 所有輸入均為小寫字母。不考慮答案輸出的順序。通過次數80,334提交次數129,632 思路 還是...

leetcode49題字母異位詞分組

leetcode49題字母異位詞分組 給定乙個字串陣列,將字母異位片語合在一起。字母異位詞指字母相同,但排列不同的字串。比如說 eat tea tan ate nat bat 那麼輸出的結果就是 ate eat tea nat tan bat 在這裡我們認為只有字母順序不同的字串是一起的,於是我們考...