第一种 : 给定一个数值 n 求它能构成的不同的BST的个数:
这类题,很像那个求斐波那契和,关键就是把状态记录
通过一个数组 把 1 到 i 的BST数目记录 , : 范围大小相等,那么BST的数目一样,接下来就可以直接利用了!
public class Solution { public int numTrees(int n) { int[] num = new int[n + 1]; num[0] = 1; for (int i = 1 ; i <= n ; i++) { // 1 到i构建BST int count = 0; for (int j = 1 ; j <= i ; j++) {//哪一个为根节点 int left = j - 1; // 左子树的节点个数 int right = i - j; // 右子树的节点个数 count += (num[left] * num[right]); } num[i] = count; } return num[n]; } }
第二种类型 : 要求的不是不同BST的个数,而是把每一棵BST列出来。
这个题目,开始的时候卡在了右子树该怎么表示那块了!!
总的来说,这个题目的思路,就是通过一个列表来存储之前数值相对应的子树,只要要表示的数值范围相同,那么子树的形状都是一样,
比如123 和 456!!!
// 1234 那么当root = 3, left = 2 root = 4 left = 3 ,我想,用一个map把对应的范围内的树存起来,用的时候在来取 // 比如把 12 的可能情况存起来,求123的BST,root=3的话,就直接可以用12的了?但是一个问题root = 1? 或者 123456 ,root = 3 // 456怎么办!!这道题目的精华就在这里了!!前面那种解法是没有错的,即通过一个链表来存放各个值对应的树!但要表示456 ,相对应的 // 就只要把123 的值+3不就等于456了吗!!!! public List<TreeNode> generateTrees(int n) { Map<Integer , List<TreeNode>> map = new HashMap<> (); // 每个值对应的树 List<TreeNode> l = new ArrayList<>(); // put 0 l.add(null); if(n < 1) return l; map.put(0,l); // 0 // put 1 l = new LinkedList<TreeNode>(); TreeNode root = new TreeNode(1); l.add(root); map.put(1, l); for(int i = 2 ; i <= n ; i++) { // 1 到 n 1234567 List<TreeNode> list = new ArrayList<>(); // TreeNode node = new TreeNode(i); // 加入 i = 7 for(int j = 1 ; j <= i ; j++) { // 1到i中哪一个值为顶点 List<TreeNode> left = map.get(j - 1); // 6 5 4 3 2 1 0 List<TreeNode> right = map.get(i - j); //0 1 2 3 4 5 6 for (TreeNode ln : left) { for (TreeNode rn : right) { TreeNode node = new TreeNode(j); //注意这一块,你不能在上面那个for循环定义TreeNode ,或者更上层,因为这里每一个treeNode对应着的就是一颗新的树 node.left = ln; // 你如果在外层循环中定义,这不会乱套了吗。 node.right = copyToRight(rn , j); //右子树的节点 就需要把左子树中相同数目的子树 的 节点 + add! list.add(node); } } } map.put(i , list); } return map.get(n); } // 只要节点的数目相同,那么他们子树形状都是一样,我们接下来要的就是遍历树,对每个节点 val + add public TreeNode copyToRight(TreeNode node , int add) { if(node == null) return node; TreeNode n = new TreeNode (node.val + add); n.left = copyToRight(node.left , add); n.right = copyToRight(node.right , add); return n; } }
相关推荐
An inorder binary tree traversal ... Then a unique binary tree (shown in Figure 1) can be generated from this sequence of operations. Your task is to give the postorder traversal sequence of this tree.
Now given a sequence of distinct non-negative integer keys, a unique BST can be constructed if it is required that the tree must also be a CBT. You are supposed to output the level order traversal ...
- 使用智能指针(如 `CComPtr` 或 `std::unique_ptr`)管理二叉树节点,确保正确释放内存。 - 在插入和删除节点时,注意保持树的平衡,避免深度过深导致性能下降。 6. **调试和测试**: - 使用 MFC 的调试工具...
二叉排序树(Binary Search Tree,BST),也称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构。它具有以下特性: 1. 每个节点包含一个键(key)、一个关联的值、一个指向左子树的指针和一个指向右子树的...
Now given a sequence of distinct non-negative integer keys, a unique BST can be constructed if it is required that the tree must also be a CBT. You are supposed to output the level order traversal ...
Due to the unique characteristics and related needs of the cognitive radio networks, design.their network protocol is a critical task. For its characteristics, design and implement a comprehensive....
- **Convert Sorted List/Array to Binary Search Tree**:将有序列表或数组转换为二叉搜索树。 - **Path Sum II**:寻找所有从根节点到叶节点的路径,其路径和等于给定的目标值。 - **Flatten Binary Tree to ...
29. Convert Sorted Array to Binary Search Tree:将有序数组转换为高度平衡的二叉搜索树。 30. Convert Sorted List to Binary Search Tree:将有序链表转换为高度平衡的二叉搜索树。 31. Binary Tree Maximum ...
29. Convert Sorted Array to Balanced Binary Search Tree:将有序数组转换成平衡的二叉搜索树。 30. Convert Sorted List to Balanced Binary Search Tree:将有序链表转换成平衡的二叉搜索树。 31. Binary Tree ...
Leetcode-tree 94题 Binary Tree Inorder Traversal 对于树的问题,大多数我们都会使用递归的方法。原因是树的左子树也是树,右子树也是树,使用递归的方法最简单快捷。这道题是需要我们用Inorder的顺序输出节点。in...
1. **智能指针** (Smart Pointers):例如`shared_ptr`, `unique_ptr`等,提供自动内存管理,防止内存泄漏。 2. **多线程** (Thread):支持线程管理和同步机制,如互斥锁、条件变量等。 3. **算法** (Algorithms):...
let binaryTree = new BinaryTree(); for (let i = 0; i ; i++) { binaryTree.insert(arr[i]); } console.log(binaryTree.arr); ``` ### 优化思路一:记录最大最小值 为了进一步优化,我们可以在二叉树中记录已...
* [Binary Search Tree](https://github.com/kamyu104/LeetCode#binary-search-tree) * [Breadth-First Search](https://github.com/kamyu104/LeetCode#breadth-first-search) * [Depth-First Search]...
加油站 leetcode 【演示记录】 报告 展示 2017/03/06 1.二和,167....2107/03/06 15.3 总和,16.3 ...总和,11....62.Unique ...63.Unique ...Binary Search Tree, 120.Triangle, 139.Word Break, 152.Maximum Produ
- 例如,验证二叉搜索树(Validate Binary Search Tree)需要判断给定的二叉树是否符合二叉搜索树的定义。 - 计算二叉树的最大深度(Maximum Depth of Binary Tree)考察递归的使用。 - 平衡二叉树(Balanced Binary...
6. BinaryTree(二叉树): 二叉树是每个节点最多有两个子节点的树数据结构,常用于组织数据,以便进行快速查找、插入和删除。文件中提到的二叉树相关题目包括: - Validate Binary Search Tree(验证二叉搜索树) ...
leetcode 分类 LeetCode Progress 128/154 Other Solutions C++,有详细思路解释 python,部分有解释 Java,部分有解释 ...norvig神牛Python代码写的很飘逸,果然是有LISP内功的人!...Unique ...Binary Tree Binar
- **Tree Search and Insertion**: Searching and inserting nodes in a binary tree. - **Tree Deletion**: Removing nodes while maintaining tree structure. - **Analysis of Tree Search and Insertion**: ...
- **二叉树的层序遍历(Binary Tree Level Order Traversal)**: 给定一棵二叉树,返回其层序遍历的结果。 - **对称树(Symmetric Tree)**: 判断一个二叉树是否是对称的。 - **相同的树(Same Tree)**: 判断两个二叉树...