[Leetcode][第95题][JAVA][不同的二叉搜索树 II][递归]
【問題描述】[中等]
【解答思路】
1. 遞歸
復雜度
2. 遞歸 從構建單棵樹到構建所有樹
構建一顆二叉搜索樹
構建一顆二叉搜索樹很簡單,只需要選擇一個根結點,然后遞歸去構建其左右子樹。
要構建多顆二叉樹,問題就在于如何選擇不同的根節點,以構建不同的樹和子樹。
在上面的代碼中,在選擇根結點的時候,可以這樣改造
// 選擇所有可能的根結點 for(int i = start; i <= end; i++){TreeNode root = new TreeNode(i);... }但是如果按照上述遞歸函數的方法寫,每次遞歸只能返回一顆樹,我們需要的是多顆樹,我們可以將不同的根結點裝入List然后返回,實際上,上述代碼可以改寫成
public List<TreeNode> helper(int start, int end){List<TreeNode> list = new ArrayList<>(); if(start > end){list.add(null);return list;}for(int i = start; i <= end; i++){TreeNode root = new TreeNode(i);......// 裝入所有根結點list.add(root);}return list;}很顯然,現在問題變成了如何構建root的左右子樹,我們拋開復雜的遞歸函數,只關心遞歸的返回值,每次選擇根結點root,我們
- 遞歸構建左子樹,并拿到左子樹所有可能的根結點列表left
- 遞歸構建右子樹,并拿到右子樹所有可能的根結點列表right
這個時候我們有了左右子樹列表,我們的左右子樹都是各不相同的,因為根結點不同,我們如何通過左右子樹列表構建出所有的以root為根的樹呢?
我們固定一個左孩子,遍歷右子樹列表,那么以當前為root根結點的樹個數就為**left.size() * right.size()**個。
class Solution {public List<TreeNode> generateTrees(int n) {if(n < 1)return new ArrayList<>();return helper(1, n);}public List<TreeNode> helper(int start, int end){List<TreeNode> list = new ArrayList<>();if(start > end){// 如果當前子樹為空,不加null行嗎?list.add(null);return list;}for(int i = start; i <= end; i++){// 想想為什么這行不能放在這里,而放在下面?// TreeNode root = new TreeNode(i);List<TreeNode> left = helper(start, i-1); List<TreeNode> right = helper(i+1, end); // 固定左孩子,遍歷右孩子for(TreeNode l : left){for(TreeNode r : right){TreeNode root = new TreeNode(i);root.left = l;root.right = r;list.add(root);}}}return list;} }關于**TreeNode root = new TreeNode(i)**的放置的位置問題
如果這行代碼放置在注釋的地方,會造成一個問題,就是以當前為root根結點的樹個數就
num = left.size() * right.size() > 1時,num棵子樹會共用這個root結點,在下面兩層for循環中,root的左右子樹一直在更新,如果每次不新建一個root,就會導致num個root為根節點的樹都相同。
關于如果當前子樹為空,不加null行不行的問題
顯然,如果一顆樹的左子樹為空,右子樹不為空,要正確構建所有樹,依賴于對左右子樹列表的遍歷,也就是上述代碼兩層for循環的地方,如果其中一個列表為空,那么循環都將無法進行。
【總結】
1. 從構建單棵樹到構建所有樹,清晰易懂的遞歸思路。 由簡單到復雜 思路二循序漸進,值得學習
2.樹的問題要善用遞歸、回溯(需要記憶化才不容易超時)
轉載鏈接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii/solution/cong-gou-jian-dan-ke-shu-dao-gou-jian-suo-you-shu-/
總結
以上是生活随笔為你收集整理的[Leetcode][第95题][JAVA][不同的二叉搜索树 II][递归]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 物联网安防技术融合在细分领域的应用分析
- 下一篇: R语言实现地理探测器的流程及代码