LeetCode 95. 不同的二叉搜尋樹 II
阿新 • • 發佈:2020-07-21
題目連結
思路分析
這個題要求我們把樹建模出來,那麼我們只好對1-n這些數字一個一個進行二叉搜尋樹建模。
我們利用二叉搜尋樹的特性,左子樹小於根節點、右子樹大於根節點的特性進行建立。我們最外圍使用1-n中的每一個數字作為根節點,然後遞迴生成其左子樹和右子樹。
但是在做這個題的時候我自己腦子有點傻逼了,因為對於每一個遞迴返回的list,我們都需要先選取左右子樹中的其中一個,然後再把另外一邊拼接上,如果左子樹或者右子樹其中一個為空,那麼就會導致當前結點的樹會被全部拋棄掉。
這個問題卡了我很TM久,然後我實在忍不住了就去看了評論區,發現他們在返回空list之前,往list中加入了null,直接避免了出現返回空list的情況(這個思路是真TMD牛逼
這裡還需要注意下邊界問題,n等於0的時候返回的是空list,而不是有一個空結點的list。
程式碼實現
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public List<TreeNode> generateTrees(int n) { if(n == 0){ return new ArrayList<TreeNode>(); } return helper(1,n); } private List<TreeNode> helper(int left, int right){ List<TreeNode> res = new LinkedList<>(); if(left > right){ res.add(null); return res; } for(int i = left; i <= right; i++){ List<TreeNode> leftNodes = helper(left, i-1); List<TreeNode> rightNodes = helper(i+1, right); for(TreeNode leftNode : leftNodes){ for(TreeNode rightNode : rightNodes){ TreeNode root = new TreeNode(i); root.left = leftNode; root.right = rightNode; res.add(root); } } } return res; } }
總結
適當利用空指標也是一件非常NB的事情