摘要:不同的二叉搜索樹輸入輸出解釋以上的輸出對應以下種不同結構的二叉搜索樹不同的二叉搜索樹給定一個整數,求以為節點組成的二叉搜索樹有多少種示例輸入輸出解釋給定一共有種不同結構的二叉搜索樹題解搜索二叉樹的定義若它的左子樹不空,則左子樹上所有結點的值
Leetcode 95 不同的二叉搜索樹 II
輸入: 3
輸出:
[ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ]
解釋:
以上的輸出對應以下 5 種不同結構的二叉搜索樹:
1 3 3 2 1 / / / 3 2 1 1 3 2 / / 2 1 2 3Leetcode 86 不同的二叉搜索樹
給定一個整數 n,求以 1 ... n 為節點組成的二叉搜索樹有多少種?
示例:
輸入: 3 輸出: 5 解釋: 給定 n = 3, 一共有 5 種不同結構的二叉搜索樹: 1 3 3 2 1 / / / 3 2 1 1 3 2 / / 2 1 2 3題解
搜索二叉樹(BST)的定義
若它的左子樹不空,則左子樹上所有結點的值均小于它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大于它的根結點的值; 它的左、右子樹也分別為二叉排序樹。
給點一個數,去構造BST.
[1, 2, 3]
可以把這個數列做左子樹和右子樹的劃分:
[1] [2, 3]
[1, 2] [3]
[1, 2] [2, 3] 又可以做左子樹和右子樹的劃分.這是一個遞歸的過程.
把遞歸的結果構造起來,即可成為答案.
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public ListgenerateTrees(int n) { if (n == 0) return new ArrayList<>(); return generateBST(1, n); } private List generateBST(int left, int right) { List res = new LinkedList<>(); if (left > right) { // 劃分不到的時候,這時候填null. res.add(null); return res; } for (int i = left; i <= right; i++) { List leftTrees = generateBST(left, i - 1); List rightTrees = generateBST(i + 1, right); for (TreeNode leftTree : leftTrees) { for (TreeNode rightTree : rightTrees) { // 注意,每個循環都要構造新的節點,不能在for 循環外面生成. TreeNode root = new TreeNode(i); root.left = leftTree; root.right = rightTree; res.add(root); } } } return res; } }
如果只需要數目,不需要生成具體的BST的話,只要能求出左子樹有幾種構造,右子樹有幾種構造,就可以最終確定.
而確定左子樹和右子樹的問題的時候,又可以劃分為子問題.
eg:
求 [1,2,3,4] 依賴于:
[1,2,3] [2,3,4]
又依賴于:
[1,2] [2,3] [3,4]的構造有幾種.
class Solution { public int numTrees(int n) { int[] res = new int[n + 2]; res[0] = 1; res[1] = 1; // 沒有左子樹和右子樹 res[2] = 2; for (int i = 3; i <= n; i++) { // 從3求到n for (int j = 1; j <= i; j++) { // 求解過程中,需要依賴于之前的解,狀態轉移方程為每一種劃分的左子樹和右子樹的構造方法乘積. res[i] += res[j - 1] * res[i - j]; } } return res[n]; } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73295.html
摘要:也就是說,有個節點的平衡二叉搜索樹,它的高度是。以搜索操作為例,如果二叉搜索樹的高度為,則時間復雜度為。二叉搜索樹的高度的確很重要。樹集合,中的或者中的,是由高度平衡的二叉搜索樹實現的。 ...
摘要:在這里我們使用數組中下標為的位置來記錄個元素可以組成的平衡二叉樹的數量。在遞歸的過程中,我們找到以當前節點作為根節點的所有平衡二叉樹,并將結果以形式返回上一級調用。 題目要求 Given n, how many structurally unique BSTs (binary search trees) that store values 1...n? For example, Gi...
摘要:有效二叉搜索樹定義如下節點的左子樹只包含小于當前節點的數。所有左子樹和右子樹自身必須也是二叉搜索樹。而我們二叉搜索樹保證了左子樹的節點的值均小于根節點的值,根節點的值均小于右子樹的值,因此中序遍歷以后得到的序列一定是升序序列。 ...
摘要:注意這里的結構和不同的二叉樹遍歷一樣,如果到空節點就返回,否則遞歸遍歷左節點和右節點。唯一不同是加入了和,所以要在遞歸之前先判斷是否符合和的條件。代碼如果該節點大于上限返回假如果該節點小于下限返回假遞歸判斷左子樹和右子樹 Validate Binary Search Tree Given a binary tree, determine if it is a valid binary...
摘要:小鹿題目驗證二叉搜索樹給定一個二叉樹,判斷其是否是一個有效的二叉搜索樹。假設一個二叉搜索樹具有如下特征節點的左子樹只包含小于當前節點的數。所有左子樹和右子樹自身必須也是二叉搜索樹。算法思路定義全局的變量,用來返回是否為二叉搜索樹。 Time:2019/4/24Title: Vaildata Binary Search TreeDifficulty: MediumAuthor: 小鹿 ...
閱讀 2826·2021-11-19 11:35
閱讀 2587·2021-11-02 14:40
閱讀 1403·2021-09-04 16:48
閱讀 3013·2019-08-30 15:55
閱讀 1767·2019-08-30 13:11
閱讀 1961·2019-08-29 11:12
閱讀 1092·2019-08-27 10:52
閱讀 3164·2019-08-26 18:36