不同的二叉搜索树 II

不同的二叉搜索树 II


今天做了下leetcode的题,又是喜闻乐见想不出思路,看了解答就豁然开朗。
leetcode题目链接

给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。

不同的二叉搜索树 II
解题思路就是,根据二叉树的特性,如果一个数比当前节点小,那么就将数放到当前数的左节点,如果数比当前数大就放到当前节点的右节点。
而1 … n 为节点组成一个二叉搜索树。
那么当当前节点为i的时候,存在[1,i-1]个左子树,[i+1,n]个右子树。
根据上面的思路我们只需要得到从1到n为根节点的树就行了。
在以I为跟节点的时候,获取[1,i-1]的左子树,[i+1,n]的右子树就行。

public class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode(int x) { val = x; }
}

public static List<TreeNode> generateTrees(int n) {
        if(n == 0){
            return null;
        }
        return getTree(1,n);
    }

    public static List<TreeNode> getTree(int start, int end){
        List<TreeNode> treeNodes = new ArrayList<TreeNode>();
        if(start>end){
            treeNodes.add(null);
            return treeNodes;
        }
        for (int i =start ;i<=end;i++){
            //以i当根节点
            //获取左子数
            List<TreeNode> leftTreeNode = getTree(start,i-1);
            //获取右子数
            List<TreeNode> rightTreeNode = getTree(i+1,end);
            for (TreeNode leftNode : leftTreeNode) {
               for (TreeNode rightNode : rightTreeNode){
                   //在这里创建新树节点,确保每次往list添加的时候都是一颗新树对象
                   TreeNode treeNode = new TreeNode(i);
                   treeNode.left = leftNode;
                   treeNode.right = rightNode;
                   treeNodes.add(treeNode);
               }
            }
        }
        return treeNodes;
    }
发布了51 篇原创文章 · 获赞 7 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_28042463/article/details/103996393