首页 > 试题广场 >

不同的二叉搜索树(二)

[编程题]不同的二叉搜索树(二)
  • 热度指数:413 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个由节点值从 1 到 n 的 n 个节点。请问由多少种不同的方法用这 n 个节点构成互不相同的二叉搜索树。
请你输出所有不同的二叉搜索树。

例如:当n=2时有
数据范围:
示例1

输入

2

输出

[{1,#,2},{2,1}]
示例2

输入

3

输出

[{1,#,2,#,3},{1,#,3,2},{2,1,3},{3,1,#,#,2},{3,2,#,1}]

说明

 

说明:本题目包含复杂数据结构TreeNode,点此查看相关信息
import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

/**
 * NC415 不同的二叉搜索树(二)
 * @author d3y1
 */
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param n int整型
     * @return TreeNode类ArrayList
     */
    public ArrayList<TreeNode> BSTgenerate (int n) {
        return dp(1, n);
    }

    /**
     * 动态规划 + 递归
     *
     * dp(m,n)表示区间[m,n]节点构成互不相同二叉搜索树的种类
     * 
     * dp(m,n) = dp(m,m-1)*dp(m+1,n) + dp(m,m)*dp(m+2,n) + ... + dp(m,n-1)*dp(n+1,n)
     *
     * @param m
     * @param n
     * @return
     */
    private ArrayList<TreeNode> dp(int m, int n){
        ArrayList<TreeNode> list = new ArrayList<TreeNode>();

        if(m > n){
            // 必须
            list.add(null);
            return list;
        }

        for(int i=m; i<=n; i++){
            ArrayList<TreeNode> leftRoots = dp(m, i-1);
            ArrayList<TreeNode> rightRoots = dp(i+1, n);

            for(TreeNode lRoot: leftRoots){
                for(TreeNode rRoot: rightRoots){
                    TreeNode root = new TreeNode(i);
                    root.left = lRoot;
                    root.right = rRoot;

                    list.add(root);
                }
            }
        }

        return list;
    }
}

发表于 2025-01-25 13:59:56 回复(0)
importjava.util.*;
 
/*
 *publicclassTreeNode {
 *  intval =0;
 *   TreeNode left =null;
 *   TreeNode right =null;
 *  publicTreeNode(intval) {
 *    this.val = val;
 *   }
 * }
 */
 
publicclassSolution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param n int整型
     * @return TreeNode类ArrayList
     */
    publicArrayList<TreeNode> BSTgenerate (intn) {
        returnbuild(1, n);
        // write code here
    }
     
    privateArrayList<TreeNode> build(intstart,intend){
        ArrayList<TreeNode> list =newArrayList<>();
        if(start > end){
            list.add(null);
            returnlist;
        }
         
        for(inti=start; i<=end; ++i){
            ArrayList<TreeNode> left = build(start, i-1);
            ArrayList<TreeNode> right = build(i+1, end);
             
            for(TreeNode p: left){
                for(TreeNode q : right){
                    TreeNode node =newTreeNode(i);
                    node.left = p;
                    node.right = q;
                    list.add(node);
                }
            }
        }
         
        returnlist;
    }
}
发表于 2022-07-13 08:52:51 回复(0)