`

unique Binary Tree

 
阅读更多

第一种 : 给定一个数值 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;
    }
    
}

 

分享到:
评论

相关推荐

    陈越、何钦铭-数据结构作业11:Tree Traversals Again二叉树非递归遍历/栈遍历

    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.

    陈越、何钦铭-数据结构作业16:Complete Binary Search 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 ...

    MFC实现binarytree,

    - 使用智能指针(如 `CComPtr` 或 `std::unique_ptr`)管理二叉树节点,确保正确释放内存。 - 在插入和删除节点时,注意保持树的平衡,避免深度过深导致性能下降。 6. **调试和测试**: - 使用 MFC 的调试工具...

    binary_search_tree.zip

    二叉排序树(Binary Search Tree,BST),也称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构。它具有以下特性: 1. 每个节点包含一个键(key)、一个关联的值、一个指向左子树的指针和一个指向右子树的...

    CBST.rar_The Keys_bst

    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 ...

    CSMA/CA MAC Protocol with Function of Monitoring based on Binary Tree Conflict Resolution for Cognitive Radio Networks

    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....

    Leetcode题目+解析+思路+答案.pdf

    - **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 ...

    Leetcode book刷题必备

    29. Convert Sorted Array to Balanced Binary Search Tree:将有序数组转换成平衡的二叉搜索树。 30. Convert Sorted List to Balanced Binary Search Tree:将有序链表转换成平衡的二叉搜索树。 31. Binary Tree ...

    leetcode添加元素使和等于-Leetcode-tree:力码树

    Leetcode-tree 94题 Binary Tree Inorder Traversal 对于树的问题,大多数我们都会使用递归的方法。原因是树的左子树也是树,右子树也是树,使用递归的方法最简单快捷。这道题是需要我们用Inorder的顺序输出节点。in...

    boost_1_68_0 binary

    1. **智能指针** (Smart Pointers):例如`shared_ptr`, `unique_ptr`等,提供自动内存管理,防止内存泄漏。 2. **多线程** (Thread):支持线程管理和同步机制,如互斥锁、条件变量等。 3. **算法** (Algorithms):...

    js构建二叉树进行数值数组的去重与优化详解

    let binaryTree = new BinaryTree(); for (let i = 0; i ; i++) { binaryTree.insert(arr[i]); } console.log(binaryTree.arr); ``` ### 优化思路一:记录最大最小值 为了进一步优化,我们可以在二叉树中记录已...

    LeetCode最全代码

    * [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]...

    gasstationleetcode-leetcode:LeetcodeOJ解决方案

    加油站 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

    leetcode java

    - 例如,验证二叉搜索树(Validate Binary Search Tree)需要判断给定的二叉树是否符合二叉搜索树的定义。 - 计算二叉树的最大深度(Maximum Depth of Binary Tree)考察递归的使用。 - 平衡二叉树(Balanced Binary...

    CleanCodeHandbook_v1.0.3

    6. BinaryTree(二叉树): 二叉树是每个节点最多有两个子节点的树数据结构,常用于组织数据,以便进行快速查找、插入和删除。文件中提到的二叉树相关题目包括: - Validate Binary Search Tree(验证二叉搜索树) ...

    leetcode分类-LeetCode:力码

    leetcode 分类 LeetCode Progress 128/154 Other Solutions C++,有详细思路解释 python,部分有解释 Java,部分有解释 ...norvig神牛Python代码写的很飘逸,果然是有LISP内功的人!...Unique ...Binary Tree Binar

    Algorithms and Data Structures - Niklaus Wirth

    - **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**: ...

    LeetCode练习答案

    - **二叉树的层序遍历(Binary Tree Level Order Traversal)**: 给定一棵二叉树,返回其层序遍历的结果。 - **对称树(Symmetric Tree)**: 判断一个二叉树是否是对称的。 - **相同的树(Same Tree)**: 判断两个二叉树...

Global site tag (gtag.js) - Google Analytics