2024.4.2
题目来源
力扣每日一题;题序:894
我的题解
方法一 分治
public List<TreeNode> allPossibleFBT(int n) {
List<TreeNode> res=new ArrayList<>();
//偶数个节点无法得到真二叉树
if(n%2==0)
return res;
return partition(n);
}
public List<TreeNode> partition(int n){
List<TreeNode> res=new ArrayList<>();
//只有一个节点必然是真二叉树
if(n==1){
res.add(new TreeNode(0));
return res;
}
for(int i=1;i<n;i+=2){
List<TreeNode> lefts=partition(i);
List<TreeNode> rights=partition(n-i-1);
for(TreeNode left:lefts){
for(TreeNode right:rights){
TreeNode root=new TreeNode(0,left,right);
res.add(root);
}
}
}
return res;
}
方法二 动态规划
public List<TreeNode> allPossibleFBT(int n) {
//偶数个节点无法得到真二叉树
if(n%2==0)
return new ArrayList<>();
List<TreeNode>[] dp=new ArrayList[n+1];
for(int i=0;i<=n;i++)
dp[i]=new ArrayList<>();
dp[1].add(new TreeNode(0));
//总节点数
for(int i=3;i<=n;i+=2){
//左子树的根节点数
for(int j=1;j<i;j+=2){
for(TreeNode left:dp[j]){
for(TreeNode right:dp[i-1-j]){
TreeNode root=new TreeNode(0,left,right);
dp[i].add(root);
}
}
}
}
return dp[n];
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~