LeetCode刷題(八) 二叉搜尋樹 回溯法

2021-10-08 17:44:36 字數 3476 閱讀 6058

二叉搜尋樹定義:

1.validate-binary-search-tree

判斷給出的二叉樹是否是乙個二叉搜尋樹(bst)

class

solution

}bool

isvalidbst

(treenode* root)

if(tag==

false

)return

true

;else

return

false;}

else

return

false;}

};

2.validate-binary-search-tree
class

solution

else

return root;}}

;

3.delete-node-in-a-bst
class

solution

}return root;}}

;

4.balanced-binary-tree
class

solution

bool

isbalanced

(treenode* root)

};

回溯法定義:

回溯法(backtrack)常用於遍歷列表所有子集,是 dfs 深度搜尋一種,一般用於全排列,窮盡所有可能,遍歷的過程實際上是乙個決策樹的遍歷過程。時間複雜度一般 o(n!),它不像動態規劃存在重疊子問題可以優化,回溯演算法就是純暴力窮舉,複雜度一般都很高。

核心就是從選擇列表裡做乙個選擇,然後一直遞迴往下搜尋答案,如果遇到路徑不通,就返回來撤銷這次選擇。

回溯演算法模板:

result =

def backtrack

(路徑, 選擇列表)

:if 滿足結束條件:

result.

add(路徑)

return

for 選擇 in 選擇列表:

做選擇backtrack

(路徑, 選擇列表)

撤銷選擇

5.subsets現在有乙個沒有重複元素的整數集合s,求s的所有子集

注意:給出的解集中不能出現重複的元素

class

solution

}

vector

int>

>

subsets

(vector<

int>

&s)}

;

vector

int>

>

subsets

(vector<

int>

&s))

;return res;

}

6.subsets-ii給出乙個可能包含重複元素的整數集合s,返回該整數集合的所有子集。

注意:給出的解集中不能包含重複的子集;你給出的子集中的元素要按非遞減的順序排列.

解題思路:首先先將s排序,然後在回溯的時候若為相同元素則跳過。

class

solution

}

vector

int>

>

subsetswithdup

(vector<

int>

&s)}

;

7.permutations給出一組數字,返回該組數字的所有排列

例如:[1,2,3]的所有排列如下

[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], [3,2,1].

以數字在陣列中的位置靠前為優先順序,按字典序排列輸出。

class

solution

for(

int i=

0;isize()

;i++)}

vector

int>

>

permute

(vector<

int>

&num)

};

8.permutations-ii給出一組可能包含重複項的數字,返回該組數字的所有排列

例如;[1,1,2]的排列如下:

[1,1,2],[1,2,1], [2,1,1].

class

solution

for(

int i=

0;isize()

;i++)}

vector

int>

>

permuteunique

(vector<

int>

&num)

};

9.combination-sum給出一組候選數c和乙個目標數t,找出候選數中加起來和等於t的所有組合。c中的數字在組合中可以被無限次使用.

注意:題目中所有的數字(包括目標數t)都是正整數

你給出的組合中的數字 (a 1, a 2, … , a k) 要按非遞增排序 (ie, a 1 ≤ a 2 ≤ … ≤ a k).

結解集中不能包含重複的組合

例如:給定的候選數集是[2,3,6,7],目標數是7

解集是:

[7][2, 2, 3]

class

solution

for(

int i=pos;i

size()

&&target-candidates[i]

>=

0;i++)}

vector

int>

>

combinationsum

(vector<

int>

&candidates,

int target)

};

10.letter-combinations-of-a-phone-number給出乙個僅包含數字的字串,給出所有可能的字母組合。

數字到字母的對映方式如下:(就像**上數字和字母的對映一樣)

LeetCode刷題 搜尋插入位置

題目描述 給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。你可以假設陣列中無重複元素。示例 1 輸入 1,3,5,6 5 輸出 2 示例 2 輸入 1,3,5,6 2 輸出 1 示例 3 輸入 1,3,5,6 7 輸出 4 示例...

LeetCode刷題筆記 98 驗證二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...

LeetCode刷題筆記 99 恢復二叉搜尋樹

二叉搜尋樹中的兩個節點被錯誤地交換。請在不改變其結構的情況下,恢復這棵樹。示例 1 輸入 1,3,null,null,2 1 3 2 輸出 3,1,null,null,2 3 1 2 示例 2 輸入 3,1,4,null,null,2 3 1 4 2輸出 2,1,4,null,null,3 2 1 ...