力扣0095——不同的二叉搜索树II

不同的二叉搜索树II

难度:中等

题目描述

给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。

示例1

输入: 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]]

题解

根据二叉搜索树的概念可以分析得到这是一个递归方法解决的问题

  • 由n个节点组成的二叉搜索树的节点值范围为[ 1 , n 1,n 1,n],用 r o o t V a l u e rootValue rootValue 表示根结点值,则 1 ≤ r o o t V a l u e ≤ n 1\leq rootValue\leq n 1rootValuen,根节点左子树的范围为[ 1 , r o o t V a l u e − 1 1,rootValue-1 1,rootValue1],根节点右子树的范围为[ r o o t V a l u e − 1 , n rootValue-1,n rootValue1,n]
  • 对于每一个根节点,左右子树有多种情况,可以是任意一个符合要求的子树
  • 用[ s t a r t , e n d start,end start,end]表示二叉搜索树的取值范围,终止条件为取值范围为空,当节点值不为空的时候分别将每个节点值作为根节点值,然后递归构造左右子树

最后将答案添加到列表中返回即可得到最终结果

想法代码

public class TreeNode
{
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int val = 0, TreeNode left = null, TreeNode right = null)
    {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}
class Solution
{
    public static void Main(String[] args)
    {
        int n = 3;
        Solution solution = new Solution();
        IList<TreeNode> ans = solution.GenerateTrees(n);
        foreach (TreeNode node in ans)
        {
            IList<int> temp = solution.InorderTraversal(node);
            foreach (var a in temp)
            {
                Console.Write(a + " ");
            }
            Console.WriteLine();
        }
    }

    public IList<TreeNode> GenerateTrees(int n)
    {
        if (n == 0)
        {
            return new List<TreeNode>();
        }
        else
        {
            return CallBack(1, n);
        }

    }

    public List<TreeNode> CallBack(int start, int end)
    {
        List<TreeNode> ans = new List<TreeNode>();
        if (start > end)
        {
            ans.Add(null);
        }
        else
        {
            for (int i = start; i <= end; i++)
            {
                List<TreeNode> leftTrees = CallBack(start,i - 1);
                List<TreeNode> rightTrees = CallBack(i + 1,end);
                foreach (var a in leftTrees)
                {
                    foreach (var b in rightTrees)
                    {
                        TreeNode root = new TreeNode(i);
                        root.left = a;
                        root.right = b;
                        ans.Add(root);
                    }
                }
            }
        }
        return ans;
    }
    public IList<int> InorderTraversal(TreeNode root)
    {
        IList<int> ans = new List<int>();
        BackTrack(root, ans);
        return ans;
    }

    public void BackTrack(TreeNode root, IList<int> ans)
    {
        if (root == null)
        {
            return;
        }

        BackTrack(root.left, ans);
        ans.Add(root.val);
        BackTrack(root.right, ans);
    }
}
ack(root.left, ans);
        ans.Add(root.val);
        BackTrack(root.right, ans);
    }
}
  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值