leetcode95 不同的二叉搜索树II

给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
示例 1:
image
输入:n = 3
输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
示例 2:

输入:n = 1
输出:[[1]]

链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
  public List<TreeNode> generateTrees(int n) {
        if(n==0) return new ArrayList<TreeNode>();
        return dfs(1,n);
    }
    public ArrayList<TreeNode> dfs(int start,int end)
    {
        ArrayList<TreeNode>  ans=new ArrayList<>();
        if(start>end)
        {
            ans.add(null);
            return ans;
//            return null;//这样做不正确,因为上层会在遍历的时候出现空指针
        }

        for(int i=start;i<=end;i++)
        {
//            TreeNode root=new TreeNode(i);
//            ans.add(root);//不能在这
            ArrayList<TreeNode> leftAarr=dfs(start,i-1);
            ArrayList<TreeNode> rightArr=dfs(i+1,end);
            for(TreeNode l:leftAarr)
            {
                for(TreeNode r:rightArr)
                {
                    TreeNode root=new TreeNode(i);
                    ans.add(root);
                    root.left=l;
                    root.right=r;
                }
            }
        }
        return ans;

    }
}

一个错误的示例,为什么错误??由于树与子树的根节点一直在变化,而没有创建新的所以会出现错误

public class seqecStack {

    List<TreeNode> ans=new ArrayList<>();

    public List<TreeNode> generateTrees(int n) {
        if(n==0) return ans;
        HashSet<Integer> usedSet=new HashSet<>();
        for(int i=1;i<=n;i++)
        {
            TreeNode head=new TreeNode(i);
            usedSet.add(i);
            dfs(head,head,usedSet,n);
            usedSet.remove(i);
        }
        return ans;
    }
    public void dfs(TreeNode head,TreeNode root,HashSet<Integer> usedSet,int n)
    {
        if(n<=usedSet.size())
        {
            TreeNode newHead=new TreeNode(head.val);
            newHead.left=head.left;
            newHead.right=head.right;
            ans.add(newHead);
            return;
        }
        for(int i=1;i<=n;i++)
        {
            if(usedSet.contains(i)||i>=root.val) continue;
            root.left=new TreeNode(i);
            usedSet.add(i);
            dfs(head,root.left,usedSet,n);
            usedSet.remove(i);
        }
        for(int j=1;j<=n;j++)
        {
            if(usedSet.contains(j)||j<root.val) continue;
            root.right=new TreeNode(j);
            usedSet.add(j);
            dfs(head,root.right,usedSet,n);
            usedSet.remove(j);
        }

    }
    public static void main(String[] args) {
        new seqecStack().generateTrees(3);
    }

}

posted @ 2021-09-01 15:11  LiangLiangAA  阅读(24)  评论(0编辑  收藏  举报
theme: { name: 'geek', avatar: '', headerBackground: '' // ... },